oracle 全局存储特定数字的列表,并将其用作PL/SQL函数中的参数值

pw9qyyiw  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(110)

我有一些数字,例如(1,2,3,7,8),它们需要存储在一个对象中(比如说,l_list),并且在调用选择查询时,这个l_list将被用作函数中的参数值。
全局存储数据:

l_list := (1,2,3,7,8);

创建函数:

create or replace function f_get_result (p_list number)
return varchar2
as 
  l_result varchar2(100);
Begin
  select l_code
  into l_result
  from table_1;

  return l_result;

end f_get_result;

调用选择查询中的函数:

select f_get_result(l_list) from dual;

到目前为止,我已经尝试将参数的数据类型定义为类型table和varray。但是,它没有工作。以下是我使用的代码:
第一个
期望值:从对偶中选择fn_id_exp(l_list);,需要用到这么多,num_array不应该在那里,
其中,l_list是存储特定数字(如(100,200,300))的对象。
请帮帮我,我在这方面有点新手。有人能给予我一个适当的例子吗?
注意:这些数字存储在什么位置和什么数据类型并不重要。要求只是调用以下代码中的所有数字(1,2,3,7,8):

select fn_id_exp(l_list) from dual;
xvw2m8pv

xvw2m8pv1#

另一个选项是使用Oracle的内置类型,它不要求您使用自己的类型。
这里有一个例子函数返回在作为集合传递的部门中工作的雇员。

SQL> create or replace function f_test (par_deptno in sys.odcinumberlist)
  2    return sys.odcivarchar2list
  3  is
  4    retval sys.odcivarchar2list;
  5  begin
  6    select ename
  7      bulk collect into retval
  8      from emp
  9      where deptno in (select * from table(par_deptno));
 10
 11    return retval;
 12  end;
 13  /

Function created.

测试:

SQL> select * from table(f_test(sys.odcinumberlist(10, 20)));

COLUMN_VALUE
--------------------------------------------------------------------------------
MILLER
KING
CLARK
FORD
ADAMS
SCOTT
JONES
SMITH

8 rows selected.

SQL>

请注意,这样的结果可能比返回一个“模拟”表中的行的字符串(其值由 * 换行符 * 字符分隔)更方便,因为如果要进一步处理结果,您可能仍然需要将它们拆分为行。
你说:
期望值:select fn_id_exp(l_list) from dual;,需要使用这么多,num_array不应该在那里
但是--为什么不呢?num_array(或者你要使用的任何类型名称)有什么问题吗?这是语法,如果你想得到结果,你应该遵循它。在我看来,愚蠢的要求。
无论如何:您可以传递一个字符串,例如逗号分隔的数值,如本例中所示;你得把它们分成几行看看有没有帮助。

SQL> create or replace function f_test (par_deptno in varchar2)
  2    return sys.odcivarchar2list
  3  is
  4    retval sys.odcivarchar2list;
  5  begin
  6    select ename
  7      bulk collect into retval
  8      from emp
  9      where deptno in (select regexp_substr(par_deptno, '[^,]+', 1, level)
 10                       from dual
 11                       connect by level <= regexp_count(par_deptno, ',') + 1
 12                      );
 13
 14    return retval;
 15  end;
 16  /

Function created.

测试:

SQL> select * from table(f_test('10, 20'));

COLUMN_VALUE
--------------------------------------------------------------------------------
SMITH
JONES
CLARK
SCOTT
KING
ADAMS
FORD
MILLER

8 rows selected.

SQL>
ghg1uchk

ghg1uchk2#

使用集合:

CREATE TYPE number_array AS TABLE OF NUMBER;

然后道:

CREATE FUNCTION fn_id_exp(
  p_branch in number_array
) return varchar2
IS
  txt varchar2(1000);
BEGIN
  SELECT LISTAGG(branch_name, CHR(10)) WITHIN GROUP (ORDER BY rn)
  INTO txt
  FROM   (SELECT ROWNUM AS rn,
                 COLUMN_VALUE AS id
          FROM   TABLE(p_branch)) i
         INNER JOIN tbl_branch b
         ON (i.id = b.branch_code);

  RETURN txt;
END;
/

然后道:

select fn_id_exp(number_array(100,200)) from dual;

给定示例数据:

CREATE TABLE tbl_branch (branch_code, branch_name) AS
SELECT 100, 'Leafy Stem' FROM DUAL UNION ALL
SELECT 200, 'Big Twig' FROM DUAL;

输出:
| 数组编号(100,200)|
| - -|
| 叶状茎大树枝|

然而

不使用函数而只使用查询可能会更简单:

SELECT branch_name
FROM   tbl_branch
WHERE  branch_code IN (100, 200)
ORDER BY branch_code;

或者,如果要使用数组::

SELECT branch_name
FROM   tbl_branch
WHERE  branch_code MEMBER OF number_array(100, 200)
ORDER BY branch_code;

或者,将数组作为绑定参数(通过JDBC等)传入,然后:

SELECT branch_name
FROM   tbl_branch
WHERE  branch_code MEMBER OF :your_array
ORDER BY branch_code;

输出:
| 分支名称|
| - -|
| 叶状茎|
| 大树枝|
fiddle

更新

如果您需要静态数组,则可以创建一个包:

CREATE PACKAGE static_data IS
  FUNCTION getList RETURN NUMBER_ARRAY;
END;
/

同身:

CREATE PACKAGE BODY static_data IS
  list NUMBER_ARRAY;

  FUNCTION getList RETURN NUMBER_ARRAY
  IS
  BEGIN
    RETURN list;
  END;
BEGIN
  list := NUMBER_ARRAY(100, 200);
END;
/

那么您可以在查询中使用它:

select fn_id_exp(static_data.getlist()) from dual;

SELECT branch_name
FROM   tbl_branch
WHERE  branch_code MEMBER OF static_data.getlist()
ORDER BY branch_code;

fiddle

相关问题