2012-06-27 3 views
0

SQL Server 쿼리에서이 매개 변수에 SQL 서버에서 변환 - 내가 쓰고 오라클 쿼리에 복사 할 수 있지만이 컴파일되지 않습니다 :매개 변수는 오라클

Compilation errors for PROCEDURE OGEN.DBD_NOT_GET_NOTES_DETAIL

Error: PLS-00103: Encountered the symbol "(" when expecting one of the following:

:= .) , @ % default character
The symbol ":=" was substituted for "(" to continue. Line: 6 Text: , NOTETYPE NUMERIC(1) = 1

은 어떻게 오라클이를 코딩 할 수 있습니까?

전체 SQL 서버 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; 
+0

SQL Server의 프로 시저에 대한 전체 코드와 Oracle –

답변

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로 선언되어야한다과 sys_refcursorRETURN보다는한다고 OUT 매개 변수가 있습니다.
+0

좋은 지적 저스틴. 프로그램에서 계산할 때 너무 오래 걸리므로 SQL 서버 쿼리에 대한 계산이 완료되었습니다. –

0

내 생각 엔 당신이 길이가 안 기능에

NOTETYPE NUMBER(1) := 1; 
+0

에 대한 전체 코드와 같이 자세하게 추가하십시오. –