sql select语句作为动态plsql块的绑定变量
Posted
技术标签:
【中文标题】sql select语句作为动态plsql块的绑定变量【英文标题】:sql select statement as bind variable for dynamic plsql block 【发布时间】:2016-12-28 11:50:57 【问题描述】:我正在尝试使用立即执行来运行 plsql 匿名块,并且 plsql 块包含一个绑定变量,其值为 sql 选择语句。但这似乎行不通。有没有办法解决这个问题。 例如
BEGIN
V_SQL:='SELECT emp_id FROM emp WHERE dept_id=10;
PLSQL_BLOCK:='DECLARE
type emp_type
IS
TABLE OF NUMBER;
emp_id emp_type;
BEGIN
EXECUTE IMMEDIATE :1 BULK COLLECT INTO emp_id;
END';
EXECUTE IMMEDIATE PLSQL_BLOCK USING V_SQL;
【问题讨论】:
【参考方案1】:如果我理解得很好,您需要使用 as SQL 查询作为绑定变量来运行整个动态 PLSQL 块;如果是这样,您可以尝试这种方式:
SQL> declare
2 vPlSqlBlock varchar2(10000);
3 vSQL varchar2(1000);
4 BEGIN
5 vSQL:='SELECT 1 from dual';
6 --
7 vPlSqlBlock:='DECLARE
8 type emp_type IS TABLE OF NUMBER;
9 emp_id emp_type;
10 vSQLDyn varchar2(1000) := :1;
11 BEGIN
12 EXECUTE IMMEDIATE vSQLDyn BULK COLLECT INTO emp_id;
13 --
14 /* whatever you need to do in your block */
15 for i in emp_id.first .. emp_id.last loop
16 dbms_output.put_line(emp_id(i));
17 end loop;
18 END;';
19
20 EXECUTE IMMEDIATE vPlSqlBlock USING vSQL;
21 end;
22 /
1
PL/SQL procedure successfully completed.
SQL> declare
2 vPlSqlBlock varchar2(10000);
3 vSQL varchar2(1000);
4 BEGIN
5 vSQL:='SELECT 1 from dual';
6 --
7 vPlSqlBlock:='DECLARE
8 type emp_type IS TABLE OF NUMBER;
9 emp_id emp_type;
10 vSQLDyn varchar2(1000) := :1;
11 BEGIN
12 EXECUTE IMMEDIATE vSQLDyn BULK COLLECT INTO emp_id;
13 /* this does nothing */
14 END;';
15
16 EXECUTE IMMEDIATE vPlSqlBlock USING vSQL;
17 end;
18 /
PL/SQL procedure successfully completed.
SQL>
【讨论】:
我尝试在没有循环的情况下运行,但它会抛出此错误:PLS-00103:在预期以下情况之一时遇到符号“文件结尾”: 没有循环是什么意思?也许你删除了太多?刚刚编辑以显示在有或没有循环的情况下如何工作;当然没有循环的版本什么都不做......【参考方案2】:请试试这个。希望这会有所帮助。
set serveroutput on;
set define on;
DECLARE
V_SQL varchar2(1000):='SELECT emp_id from emp where deptno = 10';
PLSQL_BLOCK varchar2(1000):='DECLARE
type emp_type
IS
TABLE OF NUMBER;
emp_id emp_type;
BEGIN
EXECUTE IMMEDIATE :1 BULK COLLECT INTO emp_id;
END;';
BEGIN
EXECUTE IMMEDIATE PLSQL_BLOCK USING V_SQL;
END;
【讨论】:
我的绑定变量是一个选择查询 修改了答案。希望这会有所帮助。 此代码已成功编译,但在运行时会出现错误 PLS-00103:在预期以下情况之一时遇到符号“文件结尾”: 我也在尝试使用立即执行来运行整个块【参考方案3】:您必须首先声明要在执行块中使用的变量。
试试这个:
DECLARE
V_SQL VARCHAR2(1000) := 'SELECT emp_id FROM emp WHERE dept_id=10';
PLSQL_BLOCK varchar2(1000) :='DECLARE type emp_type IS TABLE OF integer; emp_id emp_type;'
|| ' BEGIN EXECUTE IMMEDIATE :1 BULK COLLECT INTO emp_id; END;';
BEGIN
EXECUTE IMMEDIATE PLSQL_BLOCK USING V_SQL;
END;
/
【讨论】:
将 sql 查询连接到 plsql 块也会产生错误。我试过这种方式。以上是关于sql select语句作为动态plsql块的绑定变量的主要内容,如果未能解决你的问题,请参考以下文章