如何在EXECUTE IMMEDIATE查询中添加表名?

时间:2011-12-09 04:27:24

标签: sql oracle plsql

我有一个关于“EXECUTE IMMEDIATE”的问题。 我在下一个plsql语句

中动态更改了表名
DECLARE

TYPE CurTyp IS REF CURSOR;
cur CurTyp;
str1 VARCHAR2(30);
str2 VARCHAR2(30);
table_name  VARCHAR2(30);

BEGIN

select data
  into table_name
  from ref
 where o_id = 111
   and a_id = 222;



OPEN cur FOR
'select  name, sname  from :1 b,myobjects a where a.obj_id = b.obj_id'
USING table_name;
LOOP
FETCH cur INTO str1, str2;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line(str1||str2);
END LOOP;
CLOSE cur;
END

是否可以将下一个执行立即查询的结果读取到游标?

'select  name, sname  from :1 b,myobjects a where a.obj_id = b.obj_id'
    USING table_name;

或者有没有办法做到这一点?

提前致谢。

2 个答案:

答案 0 :(得分:6)

您可以使用ref_cursor 见http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

示例:

CREATE OR REPLACE PROCEDURE query_invoice(
       month VARCHAR2, 
       year VARCHAR2) IS
    TYPE cur_typ IS REF CURSOR;
    c cur_typ;
    query_str VARCHAR2(200);
    inv_num NUMBER;
    inv_cust VARCHAR2(20);
    inv_amt NUMBER;
BEGIN
    query_str := 'SELECT num, cust, amt FROM inv_' || month ||'_'|| year 
      || ' WHERE invnum = :id';
    OPEN c FOR query_str USING inv_num;
    LOOP
        FETCH c INTO inv_num, inv_cust, inv_amt;
        EXIT WHEN c%NOTFOUND;
        -- process row here
    END LOOP;
    CLOSE c;
END;
/

但正如@jonearles所说,你不能将表名插入为params

答案 1 :(得分:5)

对于对象名,您必须使用连接,而不是绑定变量。

来自Dynamic SQL chapter of the PL/SQL Language Reference

  

数据库专门使用绑定变量的值,并且确实如此   不以任何方式解释其内容。

绑定变量有助于提高安全性和性能。但它们不适用于像表这样的对象。如果传入表名,则Oracle必须解释内容,这将抵消安全性和性能优势。