将SQL转换为PL SQL

时间:2013-09-19 16:49:31

标签: sql sql-server oracle

在SQL Server中,您可以执行以下操作:

DECLARE @ID int
SET @ID=1
SELECT * FROM Person WHERE ID=@ID

什么是等效的Oracle代码?

我花了一些时间谷歌搜索这个,但我还没有找到一个anwser。

3 个答案:

答案 0 :(得分:1)

Oracle®DatabasePL / SQL用户指南中的以下链接/页面提供了变量声明的概述:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/constantvar_declaration.htm

以下示例来自用户指南中的另一页。

DECLARE
  bonus  NUMBER(8,2);
  emp_id NUMBER(6) := 100;
BEGIN
  SELECT salary * 0.10 INTO bonus FROM employees 
    WHERE employee_id = emp_id;
END;
/

......并为您的例子......

DECLARE
  p_id NUMBER(6) := 1;
BEGIN
  SELECT * FROM Person WHERE ID = p_id;
END;
/

此致

答案 1 :(得分:1)

您创建了一个绑定变量

VARIABLE ID number

分配变量必须在PL / SQL块中完成(执行是快捷方式)

execute :id := 1

然后,您可以在sql语句中使用它

SELECT * FROM Person WHERE ID=:ID ;

答案 2 :(得分:0)

我也没有办法做同样的事情。 Oracle的PL / SQL在块内运行,并且块不在查询结果窗口中显示查询结果(例如,在SQL Developer中)。您可以将它输出到Dbms输出,但它不像在SQL Server中那样快速和简单。

这是一个块的例子。

DECLARE rid NUMBER := 1;
  rec UNIQUEVALTEST%ROWTYPE;

BEGIN 
  SELECT * INTO rec FROM UNIQUEVALTEST WHERE recid = rid;
  dbms_output.put_line(rec.FNAME);
END;

我读到的PL/SQL tutorial涵盖了所有这些内容,与PM 77-1在评论中链接的内容相同。

尝试使用变量从表中快速选择并不是真的有效。例如,如果您使用的是Oracle SQL Developer,则结果将不会显示在结果“查询结果”框中。但是如果你正在进行更新或插入,它的工作方式与SQL Server几乎相同。

这是一个例子,从创建一些虚构的测试数据开始。

--Create testing table
CREATE TABLE UniqueValTest (
  fname NVARCHAR2(100),
  lname NVARCHAR2(100),
  address NVARCHAR2(100),
  city NVARCHAR2(50),
  state NVARCHAR2(2),
  zip NVARCHAR2(5),
  age NUMBER,
  recid NUMBER
  );

--Create sample data
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('JOHN', 'SMITH', '123 MAIN ST', 'JAMESTOWN', 'LA', '12345', 28, 1);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('JENNIFER', 'SMITH', '123 MAIN ST', 'JAMESTOWN', 'LA', '12345', 30, 2);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('RACHEL', 'ALLEN', '225 MAIN ST', 'JAMESTOWN', 'LA', '12345', 25, 3);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('JOSEPH', 'ALLEN', '225 MAIN ST', 'JAMESTOWN', 'LA', '12345', 25, 4);
INSERT INTO UniqueValTest (fname, lname, address, city, state, zip, age, recid)
VALUES ('MARK', 'MCBRIDE', '228 MAIN ST', 'JAMESTOWN', 'LA', '12345', 55, 5);

变量:

DECLARE rid NUMBER := 1;

BEGIN 
  UPDATE UNIQUEVALTEST SET fname = 'JAKE' WHERE recid = rid;
END;

测试一下:

SELECT * FROM UNIQUEVALTEST WHERE recid = 1;

当然,运行这样的简单更新会不必要地复杂化,但是当您开始使用游标和循环来为代码块提供更多功能时,您可以看到潜力。

SQL Fiddle example