2017-08-23 8 views
0

PL/SQLストアド・プロシージャを作成できません。たとえば、DEPTNO 20配列を含むプロシージャを出力パラメータとして使用する

create table emp(
    empno number(4,0), 
    ename varchar2(10), 
    job  varchar2(9), 
    mgr  number(4,0), 
    hiredate date, 
    sal  number(7,2), 
    comm  number(7,2), 
    deptno number(2,0), 
    constraint pk_emp primary key (empno), 
    constraint fk_deptno foreign key (deptno) references dept (deptno) 
); 

に従業員のENAMEのすべてを返すこれは私がやって管理するものですが、私はそれが手続きに書き込む/移動するように見えることはできません。

declare 
     TYPE name_array IS TABLE OF emp.ename %type 
     INDEX BY BINARY_INTEGER; 

     enames name_array; 
    begin 
     update emp set empno = empno where deptno = 20 
     returning ename bulk collect into enames; 
     for i in 1..enames.count loop 
    dbms_output.put_line('ename : '||enames(i)); 
    end loop; 

    end; 
    /
+0

特定のエラーは何ですか? – OldProgrammer

+0

ストアドプロシージャに書き込む方法がわかりません。 @OldProgrammer – Sean

+0

偶然、inとoutパラメータを持つストアドプロシージャの例を書くことができますか? @OldProgrammer – Sean

答えて

0

これは配列 として戻り型とPROCを保存した試料は、(値のテーブルを含む)単一のオブジェクトを返す場合、私はアウトパラメータ上の機能を好む

procedure sample_proc(p_cust_id in number, p_customers out custarray) 
as 
my_cust custarray := custarray(); 
+0

custarrayの宣言はありませんか? @ nitin.sharma0180 – Sean

1

を作成しています。両方を実装するコードは次のとおりです。

drop table emp purge; 
drop table dept purge; 
CREATE TABLE dept 
(
    deptno INTEGER PRIMARY KEY 
); 

CREATE TABLE emp 
(
    empno NUMBER (4, 0) 
    , ename VARCHAR2 (10) 
    , job VARCHAR2 (9) 
    , mgr NUMBER (4, 0) 
    , hiredate DATE 
    , sal NUMBER (7, 2) 
    , comm NUMBER (7, 2) 
    , deptno NUMBER (2, 0) 
    , CONSTRAINT pk_emp PRIMARY KEY (empno) 
    , CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES dept (deptno) 
); 

CREATE or replace PACKAGE emp_pkg 
AS 
    TYPE name_array_t IS TABLE OF emp.ename%TYPE 
     INDEX BY BINARY_INTEGER; 

    FUNCTION upd (p_empno IN emp.empno%TYPE) 
     RETURN name_array_t; 

    PROCEDURE upd (
     p_empno IN  emp.empno%TYPE 
     , p_names  OUT name_array_t 
    ); 
END emp_pkg; 

CREATE or replace PACKAGE BODY emp_pkg 
AS 
    FUNCTION upd (p_empno IN emp.empno%TYPE) 
     RETURN name_array_t 
    AS 
     l_names name_array_t; 
    BEGIN 
      UPDATE emp 
       SET empno = empno 
      WHERE deptno = 20 
     RETURNING ename 
      BULK COLLECT INTO l_names; 

     RETURN l_names; 
    END upd; 

    PROCEDURE upd (
     p_empno IN  emp.empno%TYPE 
     , p_names  OUT name_array_t 
    ) 
    AS 
    BEGIN 
     p_names := upd (p_empno); 
    END upd; 
END emp_pkg; 
関連する問題