将T-SQL存储过程转换为Oracle

将T-SQL存储过程转换为Oracle,oracle,tsql,stored-procedures,Oracle,Tsql,Stored Procedures,我想将下面的T-SQL存储过程转换为Oracle存储过程 CREATE PROCEDURE myProc ( @FirstName nvarchar(20), @LastName nvarchar(20) ) AS BEGIN SELECT p.PersonId, p.Address, p.FirstName, p.LastName FROM People p WHERE p.Firs

我想将下面的T-SQL存储过程转换为Oracle存储过程

CREATE PROCEDURE myProc
(
    @FirstName nvarchar(20),
    @LastName nvarchar(20)
) AS
BEGIN
    SELECT p.PersonId,
           p.Address,
           p.FirstName,
           p.LastName
      FROM People p
     WHERE p.FirstName = @FirstName
       AND p.LastName = @LastName
END
GO

您可以在oracle中将其转换为如下过程:

CREATE OR REPLACE PROCEDURE myProc
(
    i_FirstName varchar2(20), -- alternatively use People.FirstName%type instead of varchar2(20)
    i_LastName varchar(20),
    o_PersonId out People.PersonId%type,
    o_Address  out People.Address%type,
) AS
BEGIN
    SELECT p.PersonId, p.Address
      INTO o_PersonId, o_Address
      FROM People p
     WHERE p.FirstName = i_FirstName
       AND p.LastName = i_LastName;
END;
正如@a_horse_和_no_name警告的那样,上面的方法适用于单行。您也可以对多行使用以下操作:

SQL> set serveroutput on;
SQL> CREATE OR REPLACE PROCEDURE myProc
(
    i_FirstName varchar2(20), -- alternatively use People.FirstName%type instead of varchar2(20)
    i_LastName varchar(20),
    o_PersonId out People.PersonId%type,
    o_Address  out People.Address%type,
) AS
BEGIN
  for c in
   (
    SELECT p.PersonId, p.Address
      FROM People p
     WHERE p.FirstName = i_FirstName
       AND p.LastName = i_LastName
    )
   loop
     o_PersonId := c.PersonId;
     o_Address  := c.Address;
     dbms_output.put_line(' Person id : '||o_PersonId||' - Address : '||o_Address);
   end loop;
END;

SQL> var fname varchar2;
SQL> var lname varchar2;
SQL> exec myProc(:fname,:lname);
SQL> /
  • 您不需要在
    in
    类型参数之前添加
    in
    关键字,但是
    out
    类型参数需要
    out
    关键字

  • 如果您的Oracle数据库是使用Unicode字符集创建的,则应将
    NVARCHAR
    迁移到Oracle中的
    VARCHAR2

  • 或REPLACE
    部件代表重复编译存储过程。如果省略,它将引发一个错误,告诉您
    对象已经存在


那么,您在这项任务中遇到了什么问题呢?我对编写Oracle存储过程还不熟悉,但对T-SQL有很多经验。我只是想知道这个存储过程在Oracle中是什么样子的。谢谢,这很有帮助。我觉得我还有很多关于Oracle的问题要问,但我会开始新的问题。@JonathanRoberts注意,只有当查询返回一行时,这才有效。SQL Server版本可以返回多行。