日期:2014-05-17  浏览次数:20808 次

oracle一个简单的过程
CREATE OR REPLACE PROCEDURE PCR_CODE_NAME
IS
STRSQL VARCHAR2(500);
VAR_YEAR VARCHAR2(10);
VAR_MONTH VARCHAR2(10);
BEGIN
--日期
VAR_YEAR:='年';
VAR_MONTH:='月';
STRSQL:='UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)'||VAR_YEAR;
  EXECUTE IMMEDIATE STRSQL;

END;

我这样写 能编译 执行的时候说命令行未正确结束...
我的意思是将 20080202 写成 2008年02月这样的

------解决方案--------------------
用dbms_output.put_line(STRSQL)看看SQL是否正确。

------解决方案--------------------
[code=SQL][/code]
CREATE OR REPLACE PROCEDURE PCR_CODE_NAME 
IS 
STRSQL VARCHAR2(500); 
VAR_YEAR VARCHAR2(10); 
VAR_MONTH VARCHAR2(10); 
BEGIN 
--日期 
VAR_YEAR:='年'; 
VAR_MONTH:='月'; 
STRSQL:='UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)||'''||VAR_YEAR||''''; 
EXECUTE IMMEDIATE STRSQL; 
dbms_output.put_line(STRSQL) 
END; 


引用楼主 xl_0715 的帖子:
CREATE OR REPLACE PROCEDURE PCR_CODE_NAME
IS
STRSQL VARCHAR2(500);
VAR_YEAR VARCHAR2(10);
VAR_MONTH VARCHAR2(10);
BEGIN
--日期
VAR_YEAR:='年';
VAR_MONTH:='月';
STRSQL:='UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)' ¦ ¦VAR_YEAR;
EXECUTE IMMEDIATE STRSQL;

END;

我这样写 能编译 执行的时候说命令行未正确结束...
我的意思是将 20080202 写成 2008年02月这样的

------解决方案--------------------
CREATE OR REPLACE PROCEDURE PCR_CODE_NAME 
IS 
STRSQL VARCHAR2(500); 
VAR_YEAR VARCHAR2(10); 
VAR_MONTH VARCHAR2(10); 
BEGIN 
--日期 
VAR_YEAR:='年'; 
VAR_MONTH:='月'; 
STRSQL:='UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)'||VAR_YEAR; 
EXECUTE IMMEDIATE STRSQL; 
dbms_output.put_line(STRSQL) 
END;

------------
注意字符串的连接||
------解决方案--------------------
SQL code

CREATE OR REPLACE PROCEDURE PCR_CODE_NAME 
IS 
STRSQL VARCHAR2(500); 
VAR_YEAR VARCHAR2(10); 
VAR_MONTH VARCHAR2(10); 
BEGIN 
--日期 
VAR_YEAR:='年'; 
VAR_MONTH:='月'; 
STRSQL:='UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)||''' ||VAR_YEAR||''''; 
    EXECUTE IMMEDIATE STRSQL; 
    dbms_output.put_line(STRSQL) 
END; 

注释:
||''' || VAR_YEAR||''''

两个竖杠、三个单引号、两个竖杠、变量、两个竖杠、四个单引号

------解决方案--------------------
8楼的朋友如果要这么拼接,那么会显示 || 好像不是楼主需要的显示结果吧
------解决方案--------------------
需要这样更改,因为ZT_CSRQ_NAME 定义的是字符型的,那么给它赋的值应该是'字符'这种格式的,而你上边的例子是没有引号的,所以会出现命令行未正确结束...


CREATE OR REPLACE PROCEDURE PCR_CODE_NAME 
IS 
STRSQL VARCHAR2(500); 
VAR_YEAR VARCHAR2(10); 
VAR_MONTH VARCHAR2(10); 
BEGIN 
--日期 
VAR_YEAR:='年'; 
VAR_MONTH:='月'; 
STRSQL:='UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=''SUBSTR(ZT_CSRQ_CODE,1,4)' ¦ ¦VAR_YEAR ||''''; 
EXECUTE IMMEDIATE STRSQL; 

END; 


 

------解决方案--------------------
dbms_output.put_line()这个是oralce本身提供的一个包,是为了输出用的,你可以利用pl/sql运行一下,就会看到了
------解决方案--------------------
11楼的错了
原句我也写错了,应该是
UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4) ¦ ¦'年'
转成动态sql时,因为年是变量
记住以下原则

语句开头加头加一个',结尾没有遇到',那也是一个