【问题标题】:Define a collection with some columns PL/SQL用一些列 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;

`

【问题讨论】:

    标签: plsql procedure


    【解决方案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;
    

    【讨论】:

    • 好的,但是我将如何声明程序?我的意思是,我必须在一个匿名块中声明我的记录,那么如何在它之外获取集合?
    • 我不太明白,为什么你必须在匿名块中“声明”你需要的类型。可见范围呢?如果您在匿名块中声明您的类型,那么您也已经在该块中声明了您的过程。
    • 是的,没错,我只需要在同一个块中声明它们,谢谢。
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2013-07-23
    • 2017-02-11
    • 1970-01-01
    • 2023-01-24
    • 2022-01-03
    相关资源
    最近更新 更多