Oracle 传递数组以绑定变量

Oracle 传递数组以绑定变量,oracle,plsql,oracle11g,execute-immediate,bind-variables,Oracle,Plsql,Oracle11g,Execute Immediate,Bind Variables,我有一个包含查询的表,例如: select text from queries; TEXT 1 select item from items where item_no between :low_item_no and :high_item_no and description <> :irellevant Execute immedaite my_query_str using v_1, v_2, v_3; 我有一个包,它接受查询并使用 执行立即语句 但是如何绑定

我有一个包含查询的表,例如:

select text from queries;

    TEXT
1   select item from items where item_no between :low_item_no and :high_item_no and description <> :irellevant
Execute immedaite my_query_str using v_1, v_2, v_3;
我有一个包,它接受查询并使用

执行立即语句

但是如何绑定这些变量呢

我不知道在这样的查询中有多少变量,它不是静态的

我希望有一种方法可以做到这一点:

Execute immedaite my_query_str using v_array_of_vars;
到目前为止,我还不知道有什么方法可以做到这一点,只知道使用变量列表,例如:

select text from queries;

    TEXT
1   select item from items where item_no between :low_item_no and :high_item_no and description <> :irellevant
Execute immedaite my_query_str using v_1, v_2, v_3;

谢谢

我不认为您可以使用
立即执行
来实现这一点,因为在编译时有太多未知内容,所以您必须使用

下面是一个快速演示,它根据公共查询ID获取查询和变量。这假设
vars.name
中的值实际上与
querys.text
中的绑定变量名称匹配,并且我没有包含任何检查或错误处理,也没有包含其他潜在问题,或处理多个选择列表项或数据类型-仅限于基本内容:

declare
  my_query_str queries.text%type;
  my_cursor pls_integer;
  my_result pls_integer;
  my_col_descs dbms_sql.desc_tab2;
  my_num_cols pls_integer;
  my_item items.item%type;

begin
  select text into my_query_str from queries where query_id = 42;
  dbms_output.put_line(my_query_str);

  -- open cursor
  my_cursor := dbms_sql.open_cursor;
  -- parse this query
  dbms_sql.parse(my_cursor, my_query_str, dbms_sql.native);
  -- bind all variables by name; assumes bind variables match vars.name
  for r in (select name, value from vars where query_id = 42) loop
    dbms_output.put_line('Binding ' || r.name || ' || with <' || r.value ||'>');
    dbms_sql.bind_variable(my_cursor, r.name, r.value);
  end loop;

  my_result := dbms_sql.execute(my_cursor);
  dbms_output.put_line('execute got: ' || my_result);

  dbms_sql.describe_columns2(my_cursor, my_num_cols, my_col_descs);

  dbms_sql.define_column(my_cursor, 1, my_item, 30); -- whatever size matches 'item'

  -- fetch and do something with the results
  while true loop
    my_result := dbms_sql.fetch_rows(my_cursor);
    if my_result <= 0 then
      exit;
    end if;

    dbms_sql.column_value(my_cursor, 1, my_item);
    dbms_output.put_line('Got item: ' || my_item);
  end loop;

  dbms_sql.close_cursor(my_cursor);
end;
/
注意,在这种情况下,您没有关闭PL/SQL块内的光标


您也可以转换为ref游标,然后从过程中的ref游标中提取-有-但是您需要知道选择列表项的数量和类型才能做到这一点。

我不认为您可以使用
立即执行
来实现这一点,因为编译时未知的内容太多,所以您必须使用

下面是一个快速演示,它根据公共查询ID获取查询和变量。这假设
vars.name
中的值实际上与
querys.text
中的绑定变量名称匹配,并且我没有包含任何检查或错误处理,也没有包含其他潜在问题,或处理多个选择列表项或数据类型-仅限于基本内容:

declare
  my_query_str queries.text%type;
  my_cursor pls_integer;
  my_result pls_integer;
  my_col_descs dbms_sql.desc_tab2;
  my_num_cols pls_integer;
  my_item items.item%type;

begin
  select text into my_query_str from queries where query_id = 42;
  dbms_output.put_line(my_query_str);

  -- open cursor
  my_cursor := dbms_sql.open_cursor;
  -- parse this query
  dbms_sql.parse(my_cursor, my_query_str, dbms_sql.native);
  -- bind all variables by name; assumes bind variables match vars.name
  for r in (select name, value from vars where query_id = 42) loop
    dbms_output.put_line('Binding ' || r.name || ' || with <' || r.value ||'>');
    dbms_sql.bind_variable(my_cursor, r.name, r.value);
  end loop;

  my_result := dbms_sql.execute(my_cursor);
  dbms_output.put_line('execute got: ' || my_result);

  dbms_sql.describe_columns2(my_cursor, my_num_cols, my_col_descs);

  dbms_sql.define_column(my_cursor, 1, my_item, 30); -- whatever size matches 'item'

  -- fetch and do something with the results
  while true loop
    my_result := dbms_sql.fetch_rows(my_cursor);
    if my_result <= 0 then
      exit;
    end if;

    dbms_sql.column_value(my_cursor, 1, my_item);
    dbms_output.put_line('Got item: ' || my_item);
  end loop;

  dbms_sql.close_cursor(my_cursor);
end;
/
注意,在这种情况下,您没有关闭PL/SQL块内的光标


您也可以转换为ref游标,然后从过程中的ref游标中提取-有-但同样,您需要知道选择列表项的数量和类型才能做到这一点。

如果您不知道从该表中需要多少(或哪些)值,您将如何填充数组?绑定值是否也被传入;或姓名;或者它们是在其他地方查找的(例如,
查询
中的另一列)?谢谢您的评论。这两个表中都有一个query_id列(querys中的PK和vars中的FK)。这就是我如何知道哪个变量属于每个查询的原因。因此,只向您传递了一个查询ID,您必须在过程中查找查询文本和相关变量?在您的示例中,第三个绑定变量名与
vars.name
不匹配。他们真的会永远匹配吗?(如果不是……绑定名称在查询中是否始终按ID顺序排列;并且只出现一次?)如果不知道数组需要从该表中获取多少(或哪些)值,您将如何填充该数组?绑定值是否也被传入;或姓名;或者它们是在其他地方查找的(例如,
查询
中的另一列)?谢谢您的评论。这两个表中都有一个query_id列(querys中的PK和vars中的FK)。这就是我如何知道哪个变量属于每个查询的原因。因此,只向您传递了一个查询ID,您必须在过程中查找查询文本和相关变量?在您的示例中,第三个绑定变量名与
vars.name
不匹配。他们真的会永远匹配吗?(如果不是……那么绑定名称在查询中是否总是按ID顺序排列;并且只出现一次?)