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月这样的

解决方案 »

  1.   

    用dbms_output.put_line(STRSQL)看看SQL是否正确。
      

  2.   

    谢 楼上关注
    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; 
        dbms_output.put_line(STRSQL)
    END;
    向上面么? 从哪看结果呢 
      

  3.   


    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; 
      

  4.   

    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;------------
    注意字符串的连接||
      

  5.   


    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||''''两个竖杠、三个单引号、两个竖杠、变量、两个竖杠、四个单引号
      

  6.   

    谢楼上热心帮助我想知道 这个时候加 单引号的作用就是说 使用变量的时候 单引号的用法.还有就是 能通过什么语句看到 变量赋值后的完整语句么
    像dbms_output.put_line(STRSQL) ,我知道什么意思 可不会用
      

  7.   

    需要这样更改,因为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; 
     
      

  8.   

    谢谢楼上关注不过 8楼的 写法 没有 ||出现
    我想知道 这个时候加 单引号的作用 就是说 使用变量的时候 单引号的用法. 还有就是 能通过什么语句看到 变量赋值后的完整语句么 
    像dbms_output.put_line(STRSQL) ,我知道什么意思 可不会用 
      

  9.   

    dbms_output.put_line()这个是oralce本身提供的一个包,是为了输出用的,你可以利用pl/sql运行一下,就会看到了 
      

  10.   

    如何结合变量 在存储过程中 写 sql语句 
    都把我整迷糊了
    8楼的 没错 不过看11楼的也合乎常理...
      

  11.   

    你这明显有错误
    出来语句实际是
    UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)年
    而你需要的应该是 
    UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)||年
    所以语句应该是8楼的
    STRSQL:='UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)||''' ||VAR_YEAR||''''; 
      

  12.   

    11楼的错了
    原句我也写错了,应该是
    UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4) ¦ ¦'年'
    转成动态sql时,因为年是变量
    记住以下原则语句开头加头加一个',结尾没有遇到',那也是一个
    如果结尾遇到',则变成3个',即加2个'
    语句当中遇到',变成2个,单独'变成4个'
    就拿这句来转换,假设没有变量,就是这样的
    '(开头加一个)UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4) ¦ ¦''(语句中间的变成两个)年'''( 结尾变成3个) 
    当有变量时,原语句实际上是
    UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)||var_year(这里是变量,所以看不出',实际应该是'年')
    就要变成
    'UPDATE BDBJ_ZTRY SET ZT_CSRQ_NAME=SUBSTR(ZT_CSRQ_CODE,1,4)||'''(字符串结尾)|| var_year||''''(因为是单独的'所以要变成'''')
      
      

  13.   

    oracle一点也不好用,还是用MSSQL舒服得多