如何在EXECUTE IMMEDIATE查询中添加表名? [英] How to add a table name in EXECUTE IMMEDIATE query?

查看:131
本文介绍了如何在EXECUTE IMMEDIATE查询中添加表名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个关于立即执行"的问题. 我在下一个plsql语句中动态更改了表名

I have one question about "EXECUTE IMMEDIATE". I have dynamicly changed table name in next plsql statement

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

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

Is it possible to read the result of next Execute Immediate query to cursor?

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

或者也许有什么方法可以做到这一点?

Or maybe is there any way to do this?

谢谢.

推荐答案

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

You can use ref_cursor see 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所说,您不能将表名作为参数插入

but as @jonearles said, you can't insert the table names as params

这篇关于如何在EXECUTE IMMEDIATE查询中添加表名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆