0

SQL Server クエリのこのパラメーター - 作成中の Oracle クエリにコピーしますが、コンパイルされません。

PROCEDURE OGEN.DBD_NOT_GET_NOTES_DETAIL のコンパイル エラー

エラー: PLS-00103: 次のいずれかを想定しているときに、記号「(」が検出されました:

:= . ) , @ % デフォルト
の文字 記号 ":=" が "(" の代わりに使用され、続行されました。行: 6 テキスト: , NOTETYPE NUMERIC(1) = 1

これをOracleでコーディングするにはどうすればよいですか?

完全な SQL Server T-SQL クエリ:

ALTER PROCEDURE [OEN].[DB_NOT_GET_NOTES_DETAIL]
(
@FACILITYKEY CHAR(4),
@DATEFROM DATETIME, 
@DATETHRU DATETIME,
@UNITSTR VARCHAR(250),
@NOTETYPE NUMERIC(1) = 1
)
AS
BEGIN
    SELECT P.FACILITY_KEY, P.PAT_NUMBER, P.PATIENT_ID, 
             OEN.DATEONLY(N.CREATED_ON) CREATED_ON, N.NOTE_HEADER,
             N.CREATED_BY, P.LAST_NAME, P.FIRST_NAME, P.MIDDLE_NAME, P.UNIT_CODE 
       FROM OEN.EN_M_PATIENT_MAST P INNER JOIN OPTC.NOT_M_MAST N
        ON (P.PAT_NUMBER = N.PAT_NUMBER AND N.FACILITY_KEY = @FACILITYKEY)
        WHERE N.NOTE_STATUS = 0 
        AND (OEN.DATEONLY(N.CREATED_ON) BETWEEN OEN.DATEONLY(@DATEFROM) AND OEN.DATEONLY(@DATETHRU))
        AND (@UNITSTR IS NULL OR @UNITSTR = '' OR CHARINDEX(P.UNIT_CODE, @UNITSTR) % 2 = 1)
        AND @NOTETYPE = 1

END

オラクルのバージョン:

CREATE OR REPLACE PROCEDURE OEN.DBD_NOT_GET_NOTES_DETAIL (
  FACILITYKEY varchar2
, DATEFROM DATE
, DATETHRU DATE
, UNITSTR varchar2
, NOTETYPE NUMERIC(1) = 1


, OCURSOR OUT SYS_REFCURSOR
) as
BEGIN
  OPEN OCURSOR FOR
    SELECT P.FACILITY_KEY, 
    P.PAT_NUMBER, 
    P.PATIENT_ID,
      OEN.DATEONLY(N.CREATED_ON) CREATED_ON, N.NOTE_HEADER,
             N.CREATED_BY, P.LAST_NAME, P.FIRST_NAME, P.MIDDLE_NAME, P.UNIT_CODE 

      FROM OEN.EN_M_PATIENT_MAST P 
      INNER JOIN OPTC.NOT_M_MAST N ON (P.PAT_NUMBER = N.PAT_NUMBER AND N.FACILITY_KEY = FACILITYKEY)
      WHERE N.NOTE_STATUS = 0 
        AND (OEN.DATEONLY(N.CREATED_ON) BETWEEN OEN.DATEONLY(DATEFROM) AND OEN.DATEONLY(DATETHRU))
        AND CREATED_ON BETWEEN DATEFROM AND DATETHRU
       AND (UNITSTR IS NULL OR P.UNIT_CODE = UNITSTR);
    END;
4

2 に答える 2

0

私の推測では、あなたが必要です

NOTETYPE NUMBER(1) := 1;
于 2012-06-27T14:53:43.017 に答える
0

関数のパラメーターには、長さ、位取り、または精度を指定しないでください。したがって、NOTETYPEパラメーターを宣言する必要があります

NOTETYPE NUMERIC

パラメータにデフォルト値を割り当てる場合、構文は次のとおりです。

<<parameter declaration>> DEFAULT <<default value>>

まとめると、パラメータ宣言は

, NOTETYPE NUMERIC DEFAULT 1

一般的な文体の問題として、これはおそらくエラーを引き起こしませんが

  • プロシージャへのパラメータは、データ モデルの適切な型に固定することを強くお勧めします。たとえば、FACILITYKEY OPTC.NOT_M_MAST.FACILITY_KEY%TYPE. これにより、将来、列の長さを増やすなどの操作が必要になった場合に、パラメーターを調整できます。
  • データベース列と区別するパラメーターの命名規則を採用することを強くお勧めします。パラメータ名にプレフィックスを付けるのが一般的です (例: p_facility_key optc.not_m_mast.facility_key%type)。@SQL Server のように接頭辞を使用していないため、誤ってテーブル内の列の名前と一致するパラメーター名を非常に簡単に使用してしまいます。名前解決では、ローカル変数よりも列名が優先されるため、ローカル変数ではなく列を誤って使用するコードを非常に簡単に作成できます。

たとえば、この関数はEMPテーブル内のすべての行を返します。

CREATE OR REPLACE FUNCTION get_emps( empno IN emp.empno%type )
  RETURN sys_refcursor
IS
  l_rc sys_refcursor;
BEGIN
  OPEN l_rc 
   FOR SELECT *
         FROM emp e
        WHERE e.empno = empno;
  RETURN l_rc;
END;
  • このメソッドの目的は呼び出し元に何かを返すことであり、計算を行うことではないため、実際には、 ではなく として宣言する必要がありFUNCTION、パラメータPROCEDUREを持つよりも である必要があります。RETURNsys_refcursorOUT
于 2012-06-27T15:34:52.177 に答える