用一些列 PL/SQL 定义一个集合

Posted

技术标签:

【中文标题】用一些列 PL/SQL 定义一个集合【英文标题】:Define a collection with some columns PL/SQL 【发布时间】:2017-04-05 09:18:21 【问题描述】:

我必须创建一个包含 2 个字段的集合,然后创建一个具有该集合类型的变量作为参数的过程。 如果我只有 2 个字段,我怎么能创建一个集合:

TYPE an_array IS VARRAY(10) OF varchar2(20);

例如列:id、name; (不知道怎么插入)。

然后,我必须创建程序,

CREATE OR REPLACE PROCEDURE test_proc (p_array an_array) AS

但我必须使用我的列在此过程中执行某些操作。 例如,我考虑一个表 employees (id number, name varchar2(20)); 我的程序应该是这样的:

     CREATE OR REPLACE PROCEDURE test_proc (p_array an_array) AS
    CURSOR cs IS select * from employees;
    v_row employees%ROWTYPE;
    BEGIN
    OPEN cs;
    LOOP
    FETCH cs into v_row ;
    EXIT WHEN cs%NOTFOUND;
     IF (mod (v_row.id,2 ) = 0 ) then
        THE ID FIELD FROM MY COLLETION  := v_row.id;
        THE NAME FIELD FROM MY COLLECTION := v_row.name;
END LOOP;
CLOSE cs;
    END;

`

【问题讨论】:

【参考方案1】:

您可以使用记录集合。

类似的东西

declare
   type TRec is record(
      col_1 varchar2(20),
      col_2 number);

   type TList is table of TRec;

   t_l TList := TList();

   r_l TRec;

   procedure foo(a_par TList, ai_elem int) is
   begin
      if a_par.Exists(ai_elem) then
         dbms_output.put_line('Value at pos ' || ai_elem || ' is :' || a_par(ai_elem)
                              .col_2);
      else
         dbms_output.put_line('There is no element in position :' || ai_elem);
      end if;

   end;

begin
   r_l.col_1 := 'abc';
   r_l.col_2 := 10;

   t_l.Extend;
   t_l(t_l.Count) := r_l;

   foo(t_l, 1);

   foo(t_l, 3);

end;

【讨论】:

好的,但是我将如何声明程序?我的意思是,我必须在一个匿名块中声明我的记录,那么如何在它之外获取集合? 我不太明白,为什么你必须在匿名块中“声明”你需要的类型。可见范围呢?如果您在匿名块中声明您的类型,那么您也已经在该块中声明了您的过程。 是的,没错,我只需要在同一个块中声明它们,谢谢。

以上是关于用一些列 PL/SQL 定义一个集合的主要内容,如果未能解决你的问题,请参考以下文章

如何在函数中使用 Pl/SQL 集合

PL/SQL:如何根据列值插入

违反约束时显示自定义消息 PL/SQL

在咨询3列信息时,ORACLE PL / SQL错误与存储过程有关

PL/SQL - 将两个结果集缓存到集合中并将它们连接在一起?

ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误