2013-10-03 220 views
1

嗨,我对Oracle非常陌生,请帮助我将下面的SQL Server存储过程转换为Oracle存储过程。将SQL Server存储过程转换为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中正常工作。我想写在oracle中相同。我不知道如何? – user2380844

+1

回复@DStanley - 继续尝试在PL/SQL中编写它。然后突出显示不适合您的特定方面。要求为你完成每一个细节是不合理的,因为这将是非常不合理的。 –

+1

如果你看一下原文,它所做的就是从一个表中的一列中获取最大值。我想知道如何在PL-SQL中完成_that_而不是盲目地尝试在语法上进行转换。 –

回答

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