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;
  • 由于此方法的目标是向调用者返回某些内容,而不是进行计算,因此它确实应该声明为 aFUNCTION而不是 aPROCEDURE并且应该声明为RETURNthesys_refcursor而不是具有OUT参数。
于 2012-06-27T15:34:52.177 回答