2012-06-27 2 views
0

Этот параметр в запросе SQL Server - скопировать в запрос Oracle я пишу, но он не компилируется:параметр преобразования из 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

Как я могу закодировать это в 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

Пожалуйста, добавьте более подробную информацию, такую ​​как полный код процедуры на 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 и должен RETURN в sys_refcursor, а не с параметром OUT.
+0

хорошие моменты Джастин. Мы получили расчеты по запросу SQL-сервера, потому что при вычислении в программе происходило слишком много времени. –

0

Я думаю, что вам нужно

NOTETYPE NUMBER(1) := 1; 
+0

, который ему не нравится. –

Смежные вопросы