0

私はOracle PL SQLを初めて使用します。次のスクリプトの場合、どのようにプロシージャにしますか? 以下のスクリプトをプロシージャに変換して、アプリケーション (SSRS 2005) から呼び出すことができるようにする必要があります。アプリケーションは Oracle クライアント ドライバーを使用しており、以下のスクリプトを実行することはできませんが、手順を実行することはできます。そこで、スクリプトをプロシージャに変換しようと考えています。

Exec dbms_application_info.set_client_info('81'); がない場合 スクリプトはアプリケーションで問題なく実行できます。PS Toad で以下のスクリプトを実行できますが、問題ありません。

Exec dbms_application_info.set_client_info('81');

SELECT 
    ooh.order_number Order_number
    , ool.ordered_item
    ,ooh.ordered_date
FROM     apps.oe_order_headers_all ooh
    , apps.oe_order_lines_all ool
WHERE 1 = 1
    AND ooh.header_id = ool.header_id
    AND ooh.order_number = '27889292'
    --AND ooh.ordered_date BETWEEN  TO_DATE('28-FEB-2013 00:00:00', 'DD-MON-YYYY HH24:MI:SS')  AND  TO_DATE('28-FEB-2013 23:59:59', 'DD-MON-YYYY HH24:MI:SS')-- 1.3
    and ooh.ordered_date >= TO_DATE('28-FEB-2013 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
    and ooh.ordered_date < TO_DATE('01-MAR-2013 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
4

2 に答える 2

4

パラメータなし:

create or replace function GetOrderInfo return sys_refcursor 
as
  vRet sys_refcursor;
begin

  dbms_application_info.set_client_info('81');

  open vRet for 
    select  
      ooh.order_number Order_number,
      ool.ordered_item,
      ooh.ordered_date
    from 
      apps.oe_order_headers_all ooh,
      apps.oe_order_lines_all   ool
    where
       ooh.header_id = ool.header_id
       AND ooh.order_number = '27889292'
       --AND ooh.ordered_date BETWEEN  
              TO_DATE('28-FEB-2013 00:00:00', 'DD-MON-YYYY HH24:MI:SS')  
              AND  
              TO_DATE('28-FEB-2013 23:59:59', 'DD-MON-YYYY HH24:MI:SS')-- 1.3
       and ooh.ordered_date >= TO_DATE('28-FEB-2013 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
       and ooh.ordered_date < TO_DATE('01-MAR-2013 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
  ;

  return vRet;

end;

一連のパラメータを使用:

create or replace function GetOrderInfo(
  pClientId    in varchar2,
  pFromDate    in date,
  pToDate      in date, 
  pOrderNumber in varchar2
) return sys_refcursor 
as
  vRet sys_refcursor;
begin

  dbms_application_info.set_client_info(pClientId);

  open vRet for 
    select  
      ooh.order_number Order_number,
      ool.ordered_item,
      ooh.ordered_date
    from 
      apps.oe_order_headers_all ooh,
      apps.oe_order_lines_all   ool
    where
       ooh.header_id = ool.header_id
       and ooh.order_number = pOrderNumber
       --and ooh.ordered_date BETWEEN pFromDate AND pToDate-- 1.3
       and ooh.ordered_date >= pFromDate
       and ooh.ordered_date < pToDate
  ;

  return vRet;

end;
于 2013-08-09T16:15:44.753 に答える
1

2 つの別個のスクリプトが必要になります。

スクリプト 1: ストアド プロシージャを定義する

CREATE OR REPLACE PROCEDURE "PROCEDURE_NAME" (
    p_order_number  in number,
    p_start_date    in varchar2,
    p_end_date      in varchar2,
    p_cursor_out    out types.cursor_type
)
AS

BEGIN
    Exec dbms_application_info.set_client_info('81'); 

    open p_cursor_out for
    SELECT 
    ooh.order_number Order_number
     , ool.ordered_item
     ,ooh.ordered_date
      FROM     apps.oe_order_headers_all ooh
       , apps.oe_order_lines_all ool
      WHERE 1 = 1
       AND ooh.header_id = ool.header_id
      AND ooh.order_number = p_order_number
       and ooh.ordered_date >= TO_DATE(p_start_date, 'DD-MON-YYYY HH24:MI:SS')
       and ooh.ordered_date < TO_DATE(p_end_date, 'DD-MON-YYYY HH24:MI:SS')
END;

スクリプト 2: ストアド プロシージャが値を返すために使用するカーソル タイプを定義する

create or replace
PACKAGE "TYPES" AS
  TYPE cursor_type IS REF CURSOR;
END Types; 

編集: Oracle 9i以降を使用 してコメントで正しく報告されてsys_refcursorいるように、カスタムタイプを定義する代わりに使用できるため、上記のスクリプトは次のようになります。

CREATE OR REPLACE PROCEDURE "PROCEDURE_NAME" (
    p_order_number  in number,
    p_start_date    in varchar2,
    p_end_date      in varchar2,
    p_cursor_out    out sys_refcursor
)
AS

BEGIN
    dbms_application_info.set_client_info('81'); 

    open p_cursor_out for
    SELECT 
    ooh.order_number Order_number
     , ool.ordered_item
     ,ooh.ordered_date
      FROM     apps.oe_order_headers_all ooh
       , apps.oe_order_lines_all ool
      WHERE 1 = 1
       AND ooh.header_id = ool.header_id
      AND ooh.order_number = p_order_number
       and ooh.ordered_date >= TO_DATE(p_start_date, 'DD-MON-YYYY HH24:MI:SS')
       and ooh.ordered_date < TO_DATE(p_end_date, 'DD-MON-YYYY HH24:MI:SS')
END;
于 2013-08-09T14:25:18.100 に答える