2013-10-03 7 views
1

안녕하세요 저는 Oracle에 매우 익숙합니다. 아래의 SQL Server 저장 프로 시저를 Oracle 저장 프로 시저로 변환하는 데 도움을주십시오.SQL 저장 프로 시저를 Oracle 저장 프로 시저로 변환

아래는 Oracle로 변환하려고하는 SQL Server 저장 프로 시저입니다. 그러나 약간의 시간 때문에 해결책을 찾을 수 없으므로 도와주세요.

Create PROCEDURE dbo.myprocedure 
    @name   VarChar(50), 
    @columnid VarChar(50), 
    @max Int OUTPUT 

AS 
DECLARE @period int, 
     @myStatement varChar(255) 
SET @period = 99999 
SET @max = 0 

Create Table #newtable 
(
    valu INT 
) 

SET @myStatement = 'Insert INTO #newtable(valu) SELECT max(' + @columnid + ') FROM ' + @name + ' WHERE ' + 

@columnid+ ' <= ' + Convert(varChar(5), @period) 
EXEC (@myStatement) 
SELECT @max = valu FROM #newtable 

IF (@max = @period) 
    SET @max =-1 
ELSE 
    SET @max= @max+ 1 
DROP Table #newtable 

GO 

이 내가 작성 및 절차 등 값을 반환하지 않으며, 테이블이 너무 즉각적인 조항을 실행해야 떨어지고, Oracle 저장 프로 시저

Create Table newtable( valu INT); 
CREATE OR REPLACE 
PROCEDURE PROCEDURE1 
(name IN VARCHAR2 
, columnid IN VARCHAR2 
, maxid IN OUT VARCHAR2 
) 
as 
     period number; 
     mystatement varChar(255); 
    BEGIN 
    period:= 99999; 
maxid:= 0; 

    mystatement:= 'Insert INTO newtable(valu) SELECT max(columnid) FROM name WHERE columnid <= Convert(varChar(5), period)'; 

SELECT maxid = valu FROM newtable; 

    EXECUTE immediate mystatement; 

IF (maxid= period) 
    return maxid:=-1; 
ELSE 

    return maxid:= maxid + 1; 

DROP Table newtable; 

END PROCEDURE1; 
+0

위의 SQL Server에서 위의 작동합니다. 나는 오라클에 같은 것을 쓰고 싶다. 나는 어떻게 몰라? – user2380844

+1

@DStanley를 에코 - PL/SQL로 작성하십시오. 그런 다음 특정 측면을 강조 표시합니다. 그것은 매우 유엔이 될 것이므로 당신을 위해 모든 세부 사항을 요구하는 것은 합리적이지 않습니다. –

+1

원본을 살펴보면 한 테이블에서 한 열에서 최대 값을 얻는 것만 남았습니다. 나는 PL-SQL에서 문법적으로 변환하려고 시도하는 것보다 맹목적으로 시도하는 방법을 찾아 낼 것입니다. –

답변

3

음으로 변경하는 방법입니다. Oracle에서 PL/SQL과 동적 SQL에 관한 내용을 적어도 읽는 것을 고려해야합니다. 이 오라클에서 프로 시저의 예를 작업입니다,하지만 난 당신이 복잡한 방법으로 같은 간단한 작업을 할 이유 단서,이 없다 : 그것을 호출

CREATE OR REPLACE PROCEDURE MyProcedure(p_name VarChar2,p_columnid VarChar2,p_max OUT NUMBER) 
AUTHID CURRENT_USER IS 
v_period NUMBER; 
v_max NUMBER; 
BEGIN 
v_period := 99999; 
v_max := 0; 

EXECUTE IMMEDIATE 'Create Table newtable (valu NUMBER)'; 

EXECUTE IMMEDIATE 'Insert INTO newtable (valu) ((SELECT max(' || p_columnid || ') FROM ' || p_name || ' WHERE ' 
     || p_columnid || ' <= ' || TO_CHAR(v_period) || '))'; 
EXECUTE IMMEDIATE 'SELECT valu FROM newtable' INTO v_max; 

IF (v_max = v_period) THEN 
    p_max := -1; 
ELSE 
    p_max := v_max + 1; 
END IF; 
EXECUTE IMMEDIATE 'DROP Table newtable'; 
END MyProcedure; 

예 :

DECLARE 
v_tmp NUMBER; 
v_table VARCHAR2(32); 
v_column VARCHAR2(32); 
BEGIN 
v_table := 'SOME_TABLE'; 
v_column := 'SOME_COLUMN'; 
MyProcedure(v_table,v_column,v_tmp); 
DBMS_OUTPUT.PUT_LINE(v_tmp); 
END; 
+0

나는 배울려고 노력할 것이다 감사합니다 ... – user2380844

관련 문제