0

以下のコードを作成しました。

CREATE OR REPLACE  TYPE  CAL IS OBJECT(
       EMPLOYEE_NAME VARCHAR2(30), 
       R_DATE DATE,
       COMMENTS VARCHAR2(50)     
 );

CREATE OR REPLACE  TYPE  T_REC is table of cal;

create or replace function CALENDAR(v_team_name varchar2)
return t_rec
IS
v_rec t_rec;
v_COMM VARCHAR2(50);
v_name VARCHAR2(30);
BEGIN
FOR i in (Select ID,EMPLOYEE_NAME from EMPLOYEE where TEAM_NAME=v_team_name)
LOOP
v_name:=i.EMPLOYEE_NAME;
FOR k in (select EMP_ID, START_DT,END_DT-START_DT+1 DAYS,NAME,COMMENTS from EMP_ROTA where EMP_ID=i.ID)
LOOP
v_COMM:=k.NAME||', '||k.COMMENTS;
select t_rec(v_name,k.START_DT+level-1,v_COMM)
into v_rec
from dual connect by level < k.DAYS;
END LOOP;
END LOOP;
Return v_rec;
END;

関数のコンパイルで以下のエラーに直面しています。

Compilation failed,line 14 (04:33:54)
PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got CHARCompilation failed,line 14 (04:33:54)
PL/SQL: SQL Statement ignored 

関数で以下のクエリを使用している間

select v_name,k.START_DT + level -1,v_COMM
into v_REC
from dual connect by level < k.DAYS;

以下のエラーに直面しています

PL/SQL: ORA-00947: not enough valuesCompilation failed,line 14 (04:50:49)

ORA-00932 に直面しているコードの小さなスニペットを試しています。

create or replace function ROTA_CALENDAR
return t_CAL
IS
v_CAL t_CAL;
BEGIN 
select t_cal('v_name',SYSDATE,'NAME')
into v_CAL
from dual;
Return v_CAL;
END;

私は何を間違っていますか?

4

1 に答える 1

1

以下のスニペットがお役に立てば幸いです。考慮すべき点がいくつかあります。

1 命名法で "" を使用しないでください

2 以下に示すように、SELECT クエリでオブジェクト タイプから選択する必要があります。

3 INTO のみの代わりに BULK COLLECT を使用します...

    CREATE OR REPLACE
  FUNCTION CALENDAR(
      V_TEAM_NAME VARCHAR2)
    RETURN t_rec
  IS
    v_rec t_rec;
    v_COMM VARCHAR2(50);
    v_name VARCHAR2(30);
  BEGIN
    FOR i IN
    (
      SELECT
        EMPNO,
        'AVRAJIT' ENAME
      FROM
        EMP
      WHERE
        JOB=v_team_name
    )
    LOOP
      v_name:=i.ENAME;
      FOR k IN
      (
        SELECT
          EMPNO,
          SYSDATE,
          SYSDATE+1 DAYS,
          ENAME,
          JOB
        FROM
          EMP_V1
        WHERE
          EMPNO=i.EMPNO
      )
      LOOP
        v_COMM:=k.ENAME||', '||k.JOB;
        SELECT
          CAL(V_NAME,SYSDATE+1,V_COMM) BULK COLLECT
        INTO
          v_rec
        FROM
          dual
          CONNECT BY level < 10;
      END LOOP;
    END LOOP;
    RETURN v_rec;
  END;


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

SELECT OBJECT_NAME,STATUS FROM ALL_OBJECTS
WHERE OBJECT_NAME = 'CALENDAR';

OBJECT_NAME STATUS
CALENDAR    VALID

-------------------------------OUTPUT-------------------------------------------
于 2016-06-23T04:47:20.443 に答える