簡體   English   中英

如何將嵌套表作為默認參數?

[英]How to give a nested table as a default parameter?

我有一個將嵌套表和整數作為參數的函數。

我可以為整數參數創建任何默認參數。 但是對於嵌套表,我只能給出一個空表。

function  a return packageName.tOfmyrecord(i in integer:=2,j in integer:=2, k in tableofmyrecord2 package.n)  PIPELINED
is 
begin
    --do its work
end

PLS-00653: 不允許聚合/表函數

我想將返回嵌套表的函數 b 的結果作為默認參數。 此解決方案有效。 但是很麻煩。 我怎樣才能做得更好?

function  a return packageName.tOfmyrecord  PIPELINED
is
        c packageName.myrecord;
        m_cur SYS_REFCURSOR;
begin
        OPEN m_cur FOR select * from table(  
             packageName.a(2,2,  packageName.b)); --I give the 3 default parameters. 2,2 for the integer and the table returns by the funciton b
        loop
            fetch m_cur into c;
            exit when m_cur%notfound;
            PIPE ROW(c);    
        end loop;
        close  m_cur;
 end;

我也試過這個解決方案,但它不起作用。 也許只有一點點改變才能讓它起作用——

function  a return packageName.a  PIPELINED
is
begin
      return packagename(2,2,packagename.b);
end;

PLS_00633:流水線函數中的 return 語句不能包含表達式。

在 SQL 范圍內創建集合類型:

CREATE TYPE stringlist IS TABLE OF VARCHAR2(20);

然后您可以在 SQL 語句和 PL/SQL 中使用它(而如果您在 PL/SQL 范圍內定義集合,那么您只能在 PL/SQL 中使用它)。

然后你可以定義你的包規范:

CREATE PACKAGE test_package IS
  FUNCTION test_fn(
    a IN INTEGER    DEFAULT 1,
    b IN stringlist DEFAULT stringlist('a','b','c')
  ) RETURN stringlist PIPELINED;
END;
/

和包體:

CREATE PACKAGE BODY test_package IS
  FUNCTION test_fn(
    a IN INTEGER    DEFAULT 1,
    b IN stringlist DEFAULT stringlist('a','b','c')
  ) RETURN stringlist PIPELINED
  IS
  BEGIN
    IF b IS NULL THEN
      RETURN;
    END IF;

    FOR i IN 1 .. b.COUNT LOOP
      PIPE ROW ( b(i) || a );
    END LOOP;
  END;
END;
/

並使用默認參數在 SQL 中使用它:

SELECT *
FROM   TABLE( test_package.test_fn() );

哪些輸出:

\n |  COLUMN_VALUE |\n |  :----------- |\n |  a1 |\n |  b1 |\n |  c1 |\n

或者提供你自己的論點:

SELECT *
FROM   TABLE(
         test_package.test_fn(
           b => stringlist('d','e','f','g')
         )
       );

哪些輸出:

\n |  COLUMN_VALUE |\n |  :----------- |\n |  d1 |\n |  e1 |\n |  f1 |\n |  g1 |\n

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM