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
Oracle版本:
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;
答案 0 :(得分:0)
我的猜测是你需要
NOTETYPE NUMBER(1) := 1;
答案 1 :(得分: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
并且应该{{1} } RETURN
而不是sys_refcursor
参数。