【问题标题】:Function Table IN ORACLEORACLE中的函数表
【发布时间】:2009-12-28 20:41:33
【问题描述】:

我对 ORACLE 中的 TABLE 函数有些疑问。

SET SERVEROUTPUT ON SIZE 100000;

DECLARE 

int_position NUMBER(20);

TYPE T_REC_EMP IS RECORD (  nameFile VARCHAR2(200) );    

R_EMP T_REC_EMP ; -- variable enregistrement de type T_REC_EMP

TYPE TAB_T_REC_EMP IS TABLE OF T_REC_EMP index by binary_integer ;
t_rec TAB_T_REC_EMP ; -- variable tableau d''enregistrements


PROCEDURE Pc_Insert ( v_value IN VARCHAR2) IS
BEGIN

  if t_rec.exists(t_rec.Last) then
    int_position := t_rec.last;
    int_position := int_position +1;

    t_rec(int_position).nomFichier := v_value;
  else
    t_rec(1).nomFichier :=v_value;
  end if;

END;

FUNCTION calice_ORACLE( n IN NUMBER) RETURN T_REC_EMP  PIPELINED IS

BEGIN

  FOR i in 1 .. n LOOP
    PIPE ROW(t_rec(i));
  END LOOP;

  RETURN;
END;

BEGIN

    Pc_Insert('allo1');
    Pc_Insert('allo2');
    Pc_Insert('allo3');

    SELECT * fROM TABLE(calice_ORACLE(2));

END;
/

关于 SQL 语句中不支持函数的一些错误(我在 9i 9.2 vr 上)

【问题讨论】:

  • +1 你必须选择一些东西

标签: sql oracle plsql oracle9i


【解决方案1】:

首先,您不能对关联数组进行管道化。检查此以获取有关集合类型的更多信息。 http://www.developer.com/db/article.php/10920_3379271_2/Oracle-Programming-with-PLSQL-Collections.htm

其次你需要在pl/sql中选择或使用光标。

我编写了一些演示代码,以便您可以检查一下它是如何工作的。我不太确定您真正想要做什么,但至少可以编译,这很好。

create or replace type t_rec_emp as object (namefile varchar2(200));    
/

create or replace type tab_t_rec_emp is table of t_rec_emp;
/

create or replace package mydemopack as
    t_rec tab_t_rec_emp := tab_t_rec_emp(); 
    procedure pc_insert ( v_value in varchar2);
    function calice_oracle( n in integer) return tab_t_rec_emp pipelined;

end;
/

create or replace package body mydemopack as
    procedure pc_insert ( v_value in varchar2) is
    begin
        t_rec.extend(1);
        t_rec(t_rec.count):= t_rec_emp(v_value);
    end;

    function calice_oracle( n in integer) return tab_t_rec_emp pipelined is

    begin

      for i in 1 .. n loop
        pipe row(t_rec(i));
      end loop;

      return;
    end;
end;
/


declare
    cursor c_cur is
        select * from table(myDemoPack.calice_oracle(2));
begin

    myDemoPack.pc_insert('allo1');
    myDemoPack.pc_insert('allo2');
    myDemoPack.pc_insert('allo3');

    for rec in c_cur loop
        dbms_output.put_line(rec.namefile);
    end loop;

end;
/

【讨论】:

    【解决方案2】:
    • (正如 cmets 中已经指出的那样)您在 PL/SQL 中嵌入了一个 SELECT 语句,没有关于如何处理查询结果的说明。您可以SELECT INTO 本地声明的变量,也可以使用游标循环遍历结果,例如FOR rec IN (SELECT...) LOOP .. END LOOP;

    • 也许您想创建一个 PACKAGE 而不是匿名块;然后,在您的调用程序中,您可以发出像 SELECT * FROM TABLE(mypackagename.calice_ORACLE(2)) 这样的查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多