0

RECORDを返す関数があります。レコードの列の 1 つは VARRAY です。RECORDの表示方法を教えてください。(私の問題は VARRAY 列に関連しています。

create or replace TYPE phone_list_typ AS VARRAY(5) OF VARCHAR2(25);

CREATE TABLE "CUSTOMERS" 
    ("CUSTOMER_ID" NUMBER(6,0), 
     "CUST_FIRST_NAME" VARCHAR2(20 BYTE)
     "PHONE_NUMBERS" "OE"."PHONE_LIST_TYP" , 
     "CREDIT_LIMIT" NUMBER(9,2), 
     "CUST_EMAIL" VARCHAR2(40 BYTE)); 

TYPE r_cust_det IS RECORD( CUSTOMER_ID      customers.CUSTOMER_ID%TYPE
                         , CUST_FIRST_NAME  customers.CUST_FIRST_NAME%TYPE
                         , PHONE_NUMBERS    customers.PHONE_NUMBERS%TYPE
                         , CREDIT_LIMIT     customers.CREDIT_LIMIT%TYPE
                         , CUST_EMAIL       customers.CUST_EMAIL%TYPE);

CREATE OR REPLACE FUNCTION show_customer_details (n_customer_id customers.customer_id%TYPE) RETURN r_cust_det
IS
    v_return r_cust_det;
BEGIN
    SELECT CUSTOMER_ID
         , CUST_FIRST_NAME
         , PHONE_NUMBERS
         , CREDIT_LIMIT
         , CUST_EMAIL
    INTO v_return
    FROM CUSTOMERS
    WHERE CUSTOMER_ID = n_customer_id;
RETURN v_return;
END show_customer_details;
4

3 に答える 3

0

PIPELINED を使用せずに見つけた別の解決策は次のとおりです。

オブジェクト タイプを定義する

create or replace type customers_typ
is object 
    ( CUSTOMER_ID      number(6)
    , CUST_FIRST_NAME  varchar2(20)
    , PHONE_NUMBERS    varchar2(25) --phone_list_typ
    , CREDIT_LIMIT     number(9, 2)
    , CUST_EMAIL       varchar2(40)
    );

新しいタイプ、以前に定義されたオブジェクトのテーブルを定義します。

create or replace type t_customers_typ is table of customers_typ;

関数は

CREATE OR REPLACE FUNCTION show_customer_details (n_customer_id customers.customer_id%TYPE) RETURN t_customers_typ
IS
    v_return t_customers_typ;
BEGIN
    SELECT customers_typ(t1.CUSTOMER_ID
         , t1.CUST_FIRST_NAME
         , t2.column_value
         , t1.CREDIT_LIMIT
         , t1.CUST_EMAIL)
    BULK COLLECT INTO v_return
    FROM CUSTOMERS t1, table(t1.phone_numbers) t2
    WHERE t1.CUSTOMER_ID = n_customer_id
    AND t2.column_value is not null;

    return v_return;

END show_customer_details;

関数は同じように呼び出されます。

select * from table(SHOW_DETAILS.SHOW_CUSTOMER_DETAILS(101));
于 2016-10-31T15:17:28.113 に答える
0
CREATE OR REPLACE FUNCTION show_customer_details (n_customer_id customers.customer_id%TYPE) RETURN t_cust_det PIPELINED
    IS
        v_return t_cust_det;
    BEGIN
        SELECT t1.CUSTOMER_ID
             , t1.CUST_FIRST_NAME
             , t2.*
             , t1.CREDIT_LIMIT
             , t1.CUST_EMAIL
        BULK COLLECT INTO v_return
        FROM CUSTOMERS t1, table(t1.phone_numbers) t2
        WHERE t1.CUSTOMER_ID = n_customer_id
        AND column_value is not null;

        FOR i IN 1 .. v_return.count
        LOOP
            PIPE ROW (v_return(i));
        END LOOP;

    END show_customer_details;

関数呼び出しは次のとおりです。

select * from table(SHOW_DETAILS.SHOW_CUSTOMER_DETAILS(101));
于 2016-10-31T10:43:55.483 に答える