Plsql dbms_sql(Oracle 11g)中Select语句的数组绑定
我的问题是,我想在PL/SQL中执行一个动态SQL查询,其中我有一个ID列表作为数组绑定。 在Oracle文档中,我找到了一些如何将数字列表连接到DML语句的示例。() 现在,我尝试对Select语句做同样的事情。 我知道我可以对Plsql dbms_sql(Oracle 11g)中Select语句的数组绑定,plsql,oracle11g,bind-variables,Plsql,Oracle11g,Bind Variables,我的问题是,我想在PL/SQL中执行一个动态SQL查询,其中我有一个ID列表作为数组绑定。 在Oracle文档中,我找到了一些如何将数字列表连接到DML语句的示例。() 现在,我尝试对Select语句做同样的事情。 我知道我可以对executeimmediate语句使用数组绑定。但这样做的缺点是,在执行语句之前,我必须知道Bind变量的确切数量。这就是我必须使用dbms_sql的原因 以下示例仅返回一行,但应返回3行。有人知道我的例子有什么问题吗 --TestData: CREATE TABLE
executeimmediate语句使用数组绑定。但这样做的缺点是,在执行语句之前,我必须知道Bind变量的确切数量。这就是我必须使用dbms_sql的原因
以下示例仅返回一行,但应返回3行。有人知道我的例子有什么问题吗
--TestData:
CREATE TABLE PERSON AS
SELECT LEVEL AS ID, 'Person_'||LEVEL AS NAME
FROM DUAL CONNECT BY LEVEL <= 5;
declare
p_ids dbms_sql.number_table;
c number;
dummy NUMBER;
p_name varchar2(100);
begin
p_ids(1) := 2;
p_ids(2) := 3;
p_ids(3) := 4;
--
c := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(c, 'select name from PERSON where id in(:num_array)', DBMS_SQL.NATIVE);
dbms_sql.define_column(c, 1, p_name, 100);
DBMS_SQL.BIND_ARRAY(c, ':num_array', p_ids);
dummy := DBMS_SQL.EXECUTE(c);
--
loop
exit when dbms_sql.fetch_rows(c) <=0;
dbms_sql.column_value(c, 1, p_name);
dbms_output.put_line(p_name);
end loop;
DBMS_SQL.CLOSE_CURSOR(c);
end;
--测试数据:
将表人员创建为
选择级别作为ID,选择人员| |级别作为名称
从DUAL CONNECT BY LEVEL这里是我当前用于将多个值绑定到Select语句的解决方案,可能有人需要它:
--TestData:
CREATE TABLE PERSON AS
SELECT LEVEL AS ID, 'Person_'||LEVEL AS NAME
FROM DUAL CONNECT BY LEVEL <= 5;
declare
c number;
dummy NUMBER;
p_name varchar2(100);
xml$ varchar2(1000);
begin
--Generate a XML-List instead of dbms_sql.number_table:
xml$ := '<ids><id>2</id><id>3</id><id>4</id></ids>';
--
c := dbms_sql.open_cursor;
--Using XML-Functions for extracting the Values from the XML-String
DBMS_SQL.PARSE(c, 'select name
from PERSON
where id in(select extractvalue(value(x), ''id'')
from table(xmlsequence(xmltype(:ids).extract(''ids/*'')))x)'
, DBMS_SQL.NATIVE);
dbms_sql.define_column(c, 1, p_name, 100);
DBMS_SQL.BIND_variable(c, ':ids', xml$);
dummy := DBMS_SQL.EXECUTE(c);
--
loop
exit when dbms_sql.fetch_rows(c) <=0;
dbms_sql.column_value(c, 1, p_name);
dbms_output.put_line(p_name);
end loop;
DBMS_SQL.CLOSE_CURSOR(c);
end;
--测试数据:
将表人员创建为
选择级别作为ID,选择人员| |级别作为名称
据我所知,从DUAL CONNECT BY LEVEL开始,Oracle不提供将阵列绑定到
值列表中的的功能。祝你好运。