PIPELINED 函数中的 ora-000947

ora-000947 in PIPELINED function

我创建了一些 returns table 的函数。我创建记录,然后将记录设为 table.

CREATE OR REPLACE PACKAGE FOR_SELECT AS TYPE NK IS RECORD (
  SHT   NUMBER,
  VVD   NUMBER,
  NEKOM NUMBER,
  N_GOL NUMBER);
TYPE NK_T IS TABLE OF NK;  FUNCTION NEK_SLU_PR(W_KOD VARCHAR2)
RETURN NK_T PIPELINED;  END FOR_SELECT;

和我的简单函数:

CREATE OR REPLACE PACKAGE BODY FOR_SELECT  AS   FUNCTION NEK_SLU_PR(W_KOD VARCHAR2)
RETURN NK_T PIPELINED
AS
  REC   NK_T;

  SHT   NUMBER;
  VVD   NUMBER;
  NEKOM NUMBER;
  N_GOL NUMBER;
BEGIN
  SHT := 3;
  VVD := 4;
  NEKOM := 5;
  N_GOL := 6;


  SELECT SHT,
         VVD,
         NEKOM,
         N_GOL
    INTO REC
    FROM DUAL;

  PIPE ROW (REC);
  RETURN;
END NEK_SLU_PR;END FOR_SELECT;

我有 4 个变量,变量中的所有 select 都具有 table 类型,但是 ora-000947 - 没有足够的值(我做错了什么?

REC 类型错误。

它应该是 NK 而不是 NK_T,因为你处理的是一条记录。

--Try this it will help you to understand about pipelined functions

CREATE OR REPLACE TYPE NK IS OBJECT (
  SHT   NUMBER,
  VVD   NUMBER,
  NEKOM NUMBER,
  N_GOL NUMBER);

CREATE OR REPLACE TYPE NK_T IS TABLE OF NK;


CREATE OR REPLACE FUNCTION NEK_SLU_PR(
    W_KOD VARCHAR2)
  RETURN NK_T PIPELINED
AS
  REC NK_T;
  SHT   NUMBER;
  VVD   NUMBER;
  NEKOM NUMBER;
  N_GOL NUMBER;
BEGIN
  SHT   := 3;
  VVD   := 4;
  NEKOM := 5;
  N_GOL := 6;
  SELECT NK(SHT, VVD, NEKOM, N_GOL) BULK COLLECT INTO  REC FROM DUAL;
  FOR I IN 1..REC.COUNT 
    LOOP    
        PIPE ROW( NK( REC(I).sht,REC(I).vvd, REC(I).nekom, REC(I).n_gol ) ) ;
    END LOOP ;
  RETURN;
END NEK_SLU_PR;

---------------------------------------------OUTPUT-------------------------------------------

select * from table(NEK_SLU_PR('av'));


SHT VVD NEKOM   N_GOL
3      4     5     6


---------------------------------------------OUTPUT-------------------------------------------