DECLARE
  sql_stmt VARCHAR2(200);
  emp_id NUMBER(4) := 7566;
  emp_rec emp%ROWTYPE;
BEGIN
    EXECUTE IMMEDIATE 
    'CREATE TABLE bonus1 (id NUMBER, amt NUMBER)';    sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
    EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;
END;
这段代码,
sql_stmt不是一个varchar2类型的变量么,怎么去等于了一行,一个对象?
sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
动态SQ只是不可以用DDL命令和会话控制,为什么 
EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;
这里也要用execute immediate
这个是不是就是把sql_stmt放到对象emp_rec中?
为什么这么写?还用个using。

解决方案 »

  1.   

    sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
    这句话我猜测是不是就是一个字符串存放到sql_stmt中。
    但是where后面为什么是where empno =: id而不是wheren empno = id
      

  2.   

    sql_stmt 里面存放的是 'SELECT * FROM emp WHERE empno = :id' 而非什么对象,USING的功能是用emp_id替换掉动态SQL语句中的:id。
    sql_stmt INTO emp_rec USING emp_id;
    拼起来就是:'SELECT * FROM emp WHERE empno = :id' INTO emp_rec USING emp_id;‘
      

  3.   

    谢谢大侠,这回我是彻底明白了,这里的 :id 是不是动态SQL里面钻有的,就是为了后面来代替他。
      

  4.   

    建议楼主可以先看下动态SQL用法