想问三个问题,1 若table1表的字段col1是字符型 存储过程中
   v_str varchar2(100);
   v_str:='abcde';
   update table1 set col1= v_str;  这样写对吗? 虽然它能执行成功。2  循环中怎么处理动态SQL语句中的单引号?
   while cur%found loop
      ....
      msql:='update calss1 set name=''' || strName || ''',address=''' || strAddress || ''' where..... ;
      execute immediate msql ;
      commit;
      fetch cur into .....;
   end loop;
return;
exception
    when others then
    ....
   若是strName,straddress中有单引号的话会出错,这个strName,straddress是每次循环都变化的,是查询出来的值,该怎么处理呢3 我想若某次update出错后,仍能继续循环,该怎么写呢,现在只要有一次出错,就到exception了。

解决方案 »

  1.   

    1. 可以
    2. 用綁定變量可以避免

    msql := 'update calss1 set name=:vname ,address= :vaddress where..... ';
    execute immediate msql using strName, strAddress;
    3. 把update語句單獨放在一個塊裡,異常由塊裡的exception捕獲

    -- 前面是其他語句
    begin
      update ...
    exception
      ...
    end;
    -- 後面是其他語句
      

  2.   


    顶!
    再说下3:
    可以再LOOP循环中嵌套块,发生异常 continue;
      

  3.   

    第一个可以,是想更新表中所有的该字段的值?因为你没有写限制条件。
    动态SQL语句中的单引号可以用--''' 值 ''' 来代替 '值' ,这样就不会有问题了。
      

  4.   

    前面两个好处理,第三个也是在网上找了一下资料,写了下面这个例子CREATE OR REPLACE PROCEDURE LOOPEXCEPTION_TEST IS
      V_VARCHAR_TEMP VARCHAR2(500) := 'TEST';
    BEGIN  FOR I IN 1 .. 10 LOOP
        BEGIN
          V_VARCHAR_TEMP := V_VARCHAR_TEMP || V_VARCHAR_TEMP;
          DBMS_OUTPUT.PUT_LINE('[当前循环次数:' || TO_CHAR(I) || ']' ||
                               V_VARCHAR_TEMP);
        EXCEPTION
          WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('[字符长度:' || LENGTH(V_VARCHAR_TEMP) || ']' ||
                                 SQLERRM);
            V_VARCHAR_TEMP := 'TEST';
        END;
      END LOOP;
    END LOOPEXCEPTION_TEST;
      

  5.   

    nGX20080110 的方法我试验了管用。再问个弱智的问题啊,在PL/SQL中怎么调用有输出参数的存储过程并输出结果?(我已搜索了好一会儿了,没有找到合适的答案)
    create or replace procedure testd(i out int ) is
    begin
     i:=1;
     end  testd;然后在pl/sql中调用
    declare
    i int :=0;
    begin
    testd(i);
    DBMS_OUTPUT.PUT_LINE(i) ;
    end;
    但它不能输出i的值,正确的应该怎么写才能显示出这样
    i
    1
      

  6.   

    -- 設置輸出顯示到控制台
    set serveroutput ondeclare
    i int :=0;
    begin
    testd(i);
    DBMS_OUTPUT.PUT_LINE(i) ;
    end;
      

  7.   


    ----不行啊,我在PL/SQL DEVELOPER中输入以上后执行,它提示:
    ORA-06550 第2行,第7列
      

  8.   

    我沒用PL/SQL DEVELOPER,但是執行後,輸出結果應該在一個“dbms output”tab上顯示,我用的是toad。或者可以直接用sqlplus,先set serveroutput on,然後再執行你的代碼
      

  9.   

    在PLSQL的命令窗口执行,File-->New-->Command Windows。
      

  10.   

    1 若table1表的字段col1是字符型 存储过程中
      v_str varchar2(100);
      v_str:='abcde';
      update table1 set col1= v_str; 这样写对吗? 虽然它能执行成功。
    ----------------------------
    在存储过程中定义V_str的类型时,最好这样写 V_str table1.col1%type;
    这样能永远保证V_str字段类型和table1的col1字段类型一致