【问题标题】:Oracle SQL bulk variable collectOracle SQL 批量变量收集
【发布时间】:2021-04-27 15:12:18
【问题描述】:

我有以下配置表:

ID_PROCEDURE VSTR_NAME VSTR_CONTENT
P1 A C1
P1 B C2
P1 C C3
P1 D C4
P1 E C5
P1 F C6
P1 G C7

我有以下方法可以根据 id_procedure 获取 VSTR_CONTENT 值。

SET SERVEROUTPUT ON;

DECLARE
    config procedures_text_config%rowtype;
BEGIN
    SELECT
        *
    INTO config
    FROM
        procedures_text_config
    WHERE
        id_procedure = 'P1';

    dbms_output.put_line(config.vstr_content);
END;

但是,我想要一种能够以以下格式(或类似格式)提取指定 id_procedure 和 vstr_name 的 vstr_content 的方法:

config.a.vstr_content (expected output:C1).

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

我不确定你是否可以做你想做的事(至少,不是在 Oracle 中)。

从表中获取某些内容的常用方法是运行select 语句,或者,如果您愿意,也可以运行(存储的)函数。您将参数传递给它并获得结果。这就是它的工作原理。您没有传递“config.a.vstr_content”(无论它代表什么)。

这里有几个例子,看看是否有帮助。

(哦,是的 - 您的代码甚至无法运行,它会因 TOO_MANY_ROWS 错误而失败)。

示例表:

SQL> select * From config;

ID_PROCEDURE    VSTR_NAME  VSTR_CONTENT
--------------- ---------- ------------
P1              A          C1
P1              B          C2
P1              C          C3

SQL>

一个简单的函数,返回标量变量;就像您的情况一样,如果不止一行满足 WHERE 条件,它可能会失败。

SQL> create or replace function f_config
  2    (par_id_procedure in varchar2, par_name in varchar2)
  3  return config.vstr_content%type is
  4    retval config.vstr_content%type;
  5  begin
  6    select vstr_content
  7      into retval
  8      from config
  9      where (id_procedure = par_id_procedure or par_id_procedure is null)
 10        and (vstr_name = par_name or par_name is null);
 11    return retval;
 12  end;
 13  /

Function created.

测试:

SQL> select f_config('P1', 'A') from dual;

F_CONFIG('P1','A')
--------------------------------------------------------------------------------
C1

SQL> select f_config('P1', null) from dual;
select f_config('P1', null) from dual
       *
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SCOTT.F_CONFIG", line 6


SQL>

那么,返回一个 refcursor 怎么样?

SQL> create or replace function f_config
  2    (par_id_procedure in varchar2, par_name in varchar2)
  3  return sys_refcursor is
  4    retval sys_refcursor;
  5  begin
  6    open retval for
  7    select *
  8      from config
  9      where (id_procedure = par_id_procedure or par_id_procedure is null)
 10        and (vstr_name = par_name or par_name is null);
 11    return retval;
 12  end;
 13  /

Function created.

测试:

SQL> select f_config('P1', 'A') from dual;

F_CONFIG('P1','A')
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ID V VS
-- - --
P1 A C1
   
SQL> select f_config('P1', null) from dual;

F_CONFIG('P1',NULL)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ID V VS
-- - --
P1 A C1
P1 B C2
P1 C C3


SQL>

或者,返回一个集合:

SQL> create or replace type t_row as object
  2    (id_procedure varchar2(10),
  3     name varchar2(10),
  4     content varchar2(10));
  5  /

Type created.

SQL> create or replace type t_tab as table of t_row;
  2  /

Type created.

SQL> create or replace function f_config
  2    (par_id_procedure in varchar2, par_name in varchar2)
  3  return t_tab is
  4    retval t_tab;
  5  begin
  6    select t_row(id_procedure, vstr_name, vstr_content)
  7      bulk collect into retval
  8      from config
  9      where (id_procedure = par_id_procedure or par_id_procedure is null)
 10        and (vstr_name = par_name or par_name is null);
 11    return retval;
 12  end;
 13  /

Function created.

测试:

SQL> select * From table(f_config('P1', 'A'));

ID_PROCEDU NAME       CONTENT
---------- ---------- ----------
P1         A          C1

SQL> select content From table(f_config('P1', 'A'));

CONTENT
----------
C1

SQL> select * from table(f_config('P1', null));

ID_PROCEDU NAME       CONTENT
---------- ---------- ----------
P1         A          C1
P1         B          C2
P1         C          C3

SQL>

如果这些都没有帮助,请解释一下你写的最后一句话的确切含义(“但是,我想要一个方法......”)。

【讨论】:

  • 谢谢!有没有办法可以将 refcursor 选项的内容列放入 clob 变量中?
  • 我可能会解释一下我在这里尝试做的事情的大局:我正在尝试创建一个包含程序代码的表格,以便我可以然后,而不是拥有代码在过程中,从该配置表中获取它(立即执行该配置表的列)。不确定这是否是一个好习惯。
  • 这是一种不好的做法。您必须将所有内容作为动态 SQL 运行,该 SQL 无法扩展且难以调试和维护。如果我是你,我不会这样做。
  • 谢谢。不按比例是什么意思?另外,我认为立即执行只是使用动态 SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多