【问题标题】:how to use sql query as string parameter?如何使用 sql 查询作为字符串参数?
【发布时间】:2021-09-24 08:35:18
【问题描述】:

我的查询执行时没有错误或问题

select * from table(get_values_in_rows('word1:word2:word3:word4:word5:word6'));

但是当我使用查询作为字符串参数时,例如它不执行

select * from table(get_values_in_rows(
'select branch_id from nazim_shift where user_level=5 and lower(nazim_login_id)=:value1'
));

注意:

create or replace function get_values_in_rows(pv_colon_values in varchar2) return t_rows_tab is
list_values t_rows_tab := t_rows_tab();
begin

  for i in (SELECT distinct REGEXP_SUBSTR(pv_colon_values, '[^:]+', 1, LEVEL) colon_values FROM dual
  CONNECT BY REGEXP_SUBSTR(pv_colon_values, '[^:]+', 1, LEVEL) IS NOT NULL)
  loop
  list_values.extend;
  list_values(list_values.last) := t_rows(i.colon_values);
  end loop;

  return list_values;

end get_values_in_rows;

select branch_id from nazim_shift where user_level=5 and lower(nazim_login_id)=:value1

上面的查询将返回冒号分隔的值

我们正在使用 oracle 11g

【问题讨论】:

  • 你使用了一些自定义函数,我们不知道它应该做什么
  • 没人知道你的函数“get_values_in_rows”会做什么。你应该写它。
  • 如果提供的 select 语句返回一个标量值,它是以冒号分隔的列表,您需要将其传递给您的函数,不带引号
  • @astentx @Rezu 显然“get_values_in_rows”是一个split 函数。我会把它命名为split() 或to_table(),但它是'get_values_in_rows'。为什么 OP 将 SQL 查询的文本传递给它,我们只能猜测。
  • @WilliamRobertson 是的,顾名思义,它应该进行拆分。但是 OP 尝试将查询作为参数传递的原因尚不清楚。它可能在接收和执行查询的方式上“过载”,这就是为什么需要澄清黑盒部分(尤其是在没有任何示例数据时)

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

这可能是您查询中的语法错误。 := 是 PL/SQL 中的赋值运算符,您不能在查询中使用 =:。您应该像这样编辑您的查询:

select branch_id from nazim_shift where user_level=5 and lower(nazim_login_id)=value1;

【讨论】:

  • select * from table(get_values_in_rows( 'select branch_id from nazim_shift where user_level=5 and lower(nazim_login_id)='abc'' ));发现缺少右括号错误
  • 检查 regex() 的输出。那可能是错误的。
【解决方案2】:

你需要将选中的branch_id传递给函数:

select column_value as branches
from   nazim_shift ns cross join table(get_values_in_rows(ns.branch_id))
where  user_level = 5
and    lower(nazim_login_id)='def';

我可能会将拆分函数写为:

create or replace function get_values_in_rows
    ( p_string in varchar2
    , p_delimiter in varchar2 default ':' )
    return t_rows_tab
as
    list_values t_rows_tab := t_rows_tab();
begin
    select distinct regexp_substr(p_string, '[^'||p_delimiter||']+', 1, rownum)
    bulk collect into list_values
    from   dual
    connect by rownum <= regexp_count(trim(p_delimiter from p_string),p_delimiter) +1;

    return list_values;
end get_values_in_rows;

但是我也会避免将 CSV 列表存储在列中。最好有第二个表,其中各个分支 ID 存储为行,或者如果必须,使用嵌套表或可变数组列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2016-06-15
    相关资源
    最近更新 更多