Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL Server存储过程转换为Oracle存储过程_Sql_Sql Server_Oracle_Stored Procedures - Fatal编程技术网

将SQL Server存储过程转换为Oracle存储过程

将SQL Server存储过程转换为Oracle存储过程,sql,sql-server,oracle,stored-procedures,Sql,Sql Server,Oracle,Stored Procedures,您好,我对Oracle非常陌生,请帮助我将下面的SQL Server存储过程转换为Oracle存储过程 下面显示了我正试图转换为Oracle的SQL Server存储过程,但由于时间有限,我无法找到解决方案,请帮助我 Create PROCEDURE dbo.myprocedure @name VarChar(50), @columnid VarChar(50), @max Int OUTPUT AS DECLARE @period int,

您好,我对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;

嗯,创建和删除表也应该在executeimmediate子句中,过程不返回值等等。您确实应该考虑至少在Oracle中阅读关于PL/SQL和动态SQL的一些内容。 这是您在Oracle中的工作过程示例,但我不知道您为什么要以如此复杂的方式执行如此简单的任务:

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;

上述方法在sql server中运行良好。我想用甲骨文写同样的东西。我不知道怎么做?回显@DStanley-继续,试着用PL/SQL编写它。然后突出不适合你的特定方面。要求为您完成每一个细节是不合理的,因为这将是非常不合理的。如果您查看原始,它所做的只是从一个表中的一列中获取最大值。我想知道如何在PL-SQL中实现这一点,而不是盲目地尝试语法转换。
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;