参数从sql server转换为oracle

时间:2012-06-27 14:46:51

标签: sql sql-server oracle

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;

2 个答案:

答案 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参数。