SQL> CREATE TABLE my_table1( id INTEGER,name VARCHAR2(8));
Table created
SQL> DECLARE
  2   sql_str VARCHAR2(200);
  3   TYPE id_table IS TABLE OF INTEGER;
  4   TYPE name_table IS TABLE OF VARCHAR2(8);
  5   t_id id_table:=id_table(1,2,3,4,5);
  6   t_name name_table:=name_table('name1','name2','name3','name4','name5');
  7   v_retid INTEGER;
  8   v_retname VARCHAR2(8);
  9  BEGIN
 10   sql_str:='INSERT INTO my_table1 VALUES(:1,:2)';
 11   FOR i IN t_id.FIRST..t_id.LAST LOOP
 12   --USING 帮定所有参数
 13    EXECUTE IMMEDIATE  sql_str USING t_id(i),t_name(i);
 14   END LOOP;
 15    sql_str:='SELECT id,name FROM my_table1 WHERE id=:id';
 16   FOR i IN t_id.FIRST..t_id.LAST LOOP
 17    EXECUTE IMMEDIATE sql_str INTO v_retid,v_retname USING t_id(i);
 18    DBMS_OUTPUT.PUT_LINE('通过动态SQL插入的ID为'||v_retid||'; name 为'||v_retname||';');
 19   END LOOP;
 20  END;
 21  /
通过动态SQL插入的ID为1; name 为name1;
通过动态SQL插入的ID为2; name 为name2;
通过动态SQL插入的ID为3; name 为name3;
通过动态SQL插入的ID为4; name 为name4;
通过动态SQL插入的ID为5; name 为name5;PL/SQL procedure successfully completed
SQL> DECLARE
  2   sql_str VARCHAR2(200);
  3   sql_block VARCHAR2(500);
  4   v_retid INTEGER;
  5   v_rename VARCHAR2(8);
  6   v_retid1 INTEGER;
  7   v_rename1 VARCHAR2(8);
  8  BEGIN
  9   sql_str:='UPDATE my_table1 SET name=:arg1 WHERE id= :arg2';
 10   sql_str:=sql_str||'RETURNING id,name INTO :arg3,:arg4';
 11   --采用USING 取出数据
 12   EXECUTE IMMEDIATE sql_str USING 'USING',1,OUT v_retid,OUT v_rename;
 13   --显示数据
 14   sql_block:='BEGIN';
 15   sql_block:=sql_block||'DBMS_OUTPUT.PUT_LINE(''通过动态SQL更新了id为'||v_retid||'的记录,使名字为'||v_rename||''');';
 16   sql_block:=sql_block||'END';
 17   EXECUTE IMMEDIATE sql_block;
 18   --采用RETUNING INTO取出数据
 19   EXECUTE IMMEDIATE sql_str USING 'RETURN',2 RETURN INTO v_retid1,v_rename1;
 20    --显示数据
 21   sql_block:='BEGIN';
 22   sql_block:=sql_block||'DBMS_OUTPUT.PUT_LINE(''通过动态SQL更新了id为'||v_retid||'的记录,使名字为'||v_rename||''');';
 23   sql_block:=sql_block||'END';
 24   EXECUTE IMMEDIATE sql_block;
 25  END;
 26  /DECLARE
 sql_str VARCHAR2(200);
 sql_block VARCHAR2(500);
 v_retid INTEGER;
 v_rename VARCHAR2(8);
 v_retid1 INTEGER;
 v_rename1 VARCHAR2(8);
BEGIN
 sql_str:='UPDATE my_table1 SET name=:arg1 WHERE id= :arg2';
 sql_str:=sql_str||'RETURNING id,name INTO :arg3,:arg4';
 --采用USING 取出数据
 EXECUTE IMMEDIATE sql_str USING 'USING',1,OUT v_retid,OUT v_rename;
 --显示数据
 sql_block:='BEGIN';
 sql_block:=sql_block||'DBMS_OUTPUT.PUT_LINE(''通过动态SQL更新了id为'||v_retid||'的记录,使名字为'||v_rename||''');';
 sql_block:=sql_block||'END';
 EXECUTE IMMEDIATE sql_block;
 --采用RETUNING INTO取出数据
 EXECUTE IMMEDIATE sql_str USING 'RETURN',2 RETURN INTO v_retid1,v_rename1;
  --显示数据
 sql_block:='BEGIN';
 sql_block:=sql_block||'DBMS_OUTPUT.PUT_LINE(''通过动态SQL更新了id为'||v_retid||'的记录,使名字为'||v_rename||''');';
 sql_block:=sql_block||'END';
 EXECUTE IMMEDIATE sql_block;
END;ORA-00933: SQL 命令未正确结束
ORA-06512: 在line 12SQL>

解决方案 »

  1.   

    sql_block:='BEGIN';
     sql_block:=sql_block||'DBMS_OUTPUT ...
    这里拼起来后 BEGIN 与 后面的 DBMS_OUTPUT 之间没有空格
      

  2.   

    从这理出错了,修改为:
    sql_block:='BEGIN ';
    sql_block:=sql_block||'DBMS_OUTPUT.PUT_LINE(''通过动态SQL更新了id为'''||v_retid||'的记录,使名字为'||v_rename||''');';
    sql_block:=sql_block||' END;';
    EXECUTE IMMEDIATE sql_block;
    --采用RETUNING INTO取出数据
    EXECUTE IMMEDIATE sql_str USING 'RETURN',2 RETURN INTO v_retid1,v_rename1;
    --显示数据
    sql_block:='BEGIN ';
    sql_block:=sql_block||'DBMS_OUTPUT.PUT_LINE(''通过动态SQL更新了id为'''||v_retid||'的记录,使名字为'||v_rename||''');';
    sql_block:=sql_block||' END;';
    EXECUTE IMMEDIATE sql_block;
    END;
    /
      

  3.   

    SQL> DECLARE
      2   sql_str VARCHAR2(200);
      3   sql_block VARCHAR2(500);
      4   v_retid INTEGER;
      5   v_rename VARCHAR2(8);
      6   v_retid1 INTEGER;
      7   v_rename1 VARCHAR2(8);
      8  BEGIN
      9   sql_str:='UPDATE my_table1 SET name=:arg1 WHERE id= :arg2';
     10   sql_str:=sql_str||'RETURNING id,name INTO :arg3,:arg4';
     11   --采用USING 取出数据
     12   EXECUTE IMMEDIATE sql_str USING 'USING',1,OUT v_retid,OUT v_rename;--ERROR?
     13   --显示数据
     14  BEGIN
     15    DBMS_OUTPUT.PUT_LINE('通过动态SQL更新了id为'||v_retid||'的记录,使名字为'||v_rename);
     16    END;
     17   --采用RETUNING INTO取出数据
     18   EXECUTE IMMEDIATE sql_str USING 'RETURN',2 RETURN INTO v_retid1,v_rename1;
     19    --显示数据
     20    BEGIN
     21    DBMS_OUTPUT.PUT_LINE('通过动态SQL更新了id为'||v_retid1||'的记录,使名字为'||v_rename1);
     22    END;
     23  END;
     24  /DECLARE
     sql_str VARCHAR2(200);
     sql_block VARCHAR2(500);
     v_retid INTEGER;
     v_rename VARCHAR2(8);
     v_retid1 INTEGER;
     v_rename1 VARCHAR2(8);
    BEGIN
     sql_str:='UPDATE my_table1 SET name=:arg1 WHERE id= :arg2';
     sql_str:=sql_str||'RETURNING id,name INTO :arg3,:arg4';
     --采用USING 取出数据
     EXECUTE IMMEDIATE sql_str USING 'USING',1,OUT v_retid,OUT v_rename;--ERROR?
     --显示数据
    BEGIN
      DBMS_OUTPUT.PUT_LINE('通过动态SQL更新了id为'||v_retid||'的记录,使名字为'||v_rename);
      END;
     --采用RETUNING INTO取出数据
     EXECUTE IMMEDIATE sql_str USING 'RETURN',2 RETURN INTO v_retid1,v_rename1;
      --显示数据
      BEGIN
      DBMS_OUTPUT.PUT_LINE('通过动态SQL更新了id为'||v_retid1||'的记录,使名字为'||v_rename1);
      END;
    END;ORA-00933: SQL 命令未正确结束
    ORA-06512: 在line 12SQL>
      

  4.   

    修改如下语句:
    EXECUTE IMMEDIATE sql_str USING 'USING',1 returning into v_retid, v_rename;EXECUTE IMMEDIATE sql_str USING 'RETURN',2 RETURNing INTO v_retid1,v_rename1;