1

Oracle SQL 4.0.0 のバージョンに関して 1 つ質問があります...小さなデータセットを返す関数に関するものです

したがって、プロシージャには3つの受信パラメータと送信データセットがあります...これは私がこれまでに持っているものです

CREATE OR REPLACE FUNCTION "PARTS"(a IN VARCHAR,
                                   b IN VARCHAR2,
                                   c IN VARCHAR2)
  RETURN SYS_REFCURSOR
AS
  final       SYS_REFCURSOR;
  par         VARCHAR(32);
  description VARCHAR(32);
  inputvars   VARCHAR(1024);
  a1          VARCHAR(32);
  BEGIN

    IF a IS NULL THEN
      a1 := 'NOT_REQD';
    ELSE
      a1 := a;
    END IF;

    OPEN final FOR
      SELECT substr(number1, 3)
      INTO par
        , description1
      FROM class_event_element
      WHERE substr(a, 4) = a1
            AND name = b
            AND vart = c;

    RETURN final;

    EXCEPTION
      WHEN no_data_found THEN RETURN ('NONE');
      WHEN OTHERS THEN RETURN ('ERROR');
  END;

この関数の説明は、複数回呼び出したいということです。そのため、もちろん最初に作成しています。したがって、テーブル内のデータは可能ですが、 を持つ必要はありません。それが IF を持つ理由です。

それから私は単純な Select ステートメントを持っているだけです。そこに数値の substr 関数が必要です。

私の主な問題は、グーグルで半日検索した後... SYS_REFCURSOR Finalを返す方法がわからないことです。これに関するアドバイスはありますか、または少なくとも、関数が必要な結果セットを返すことができるように、これを機能させるために何を変更すればよいか考えていますか?

4

1 に答える 1

2

この一連の「スターター」変更を使用して、into 句も削除します。

TYPE ResultSet is REF CURSOR;

create or replace PROCEDURE  PARTS (iclassname IN varchar, idevice_name IN varchar2,  idevice_variant IN varchar2, partsfinal out Resultset)

AS


part varchar2(32):=NULL;
description varchar(32):=NULL;
inputvars varchar2(1024):=NULL;
classname1 varchar2(32):=NULL;

begin

IF iclassname is null THEN
classname1 := 'NOT_REQD';
ELSE 
classname1 := iclassname;
END IF;

OPEN partsFinal FOR SELECT substr(partnumber1,3) part, partdescription1 
   FROM         
   lookup_atm_class_event_element
WHERE 
   substr(classname,4) = classname1
   and device_name = idevice_name
   and device_variant = idevice_variant;

RETURN;

exception
when others then
  open partsfinal for select 'ERR', 'Error' from dual;
end;

エラーを処理するためにこのプロシージャを呼び出すコードに必要なものを反映するように、エラーの戻り部分を微調整する必要があります。

于 2014-05-06T15:23:58.667 に答える