声明ORA-06550 PLS-00103之后的PLSQL oracle选择

时间:2016-06-13 08:31:15

标签: sql oracle plsql

使用PL / SQL Developer客户端。
Oracle抛出ORA-065550 PLS-00103遇到符号“SELECT”。 好吧,在这里找不到什么问题。

DECLARE someId NUMBER;
BEGIN
    select id into someId from someTable where someColumn = 'someUniqueValue';
    select * from someTable; --here
END;
select * from someTable; --or here

没有第二个选择,也没有第三个选择。当我dmbs_output someId进入控制台时它运行良好,这将分配给声明的变量。但为什么我不能在'进入'之后选择?我想宣布一个时间值,然后制作
      select * from someTable where id = someId 或者被准备好想要进行千次插入,我想缓存第一次选择。

DECLARE someId NUMBER;
BEGIN
    select id into someId from someTable where someColumn = 'someValue';
END;
/
select * from otherTable where otherTableId = someId;

我猜这里失去了一些范围。

3 个答案:

答案 0 :(得分:1)

假设你正在编写一个sql脚本,你可以

1)声明你的变量 2)在匿名的pl / sql块中填充它 3)在别处使用

    --1 
   variable my_num number
    --2
    begin
      select 1 into :my_num from dual;
    end;
    /
    --3
    select :my_num from dual;

答案 1 :(得分:1)

基本上你在做这段代码时犯了很多错误。

1.你不能在匿名区块中'SELECT *'。你需要有光标才能做到这一点。

2.你的变量范围直到匿名块。现在您尝试访问块外的变量 - > NAAH不可能。

所以我试图通过以下代码解决您的问题,希望它有所帮助。

DECLARE
  someId NUMBER;
  p_lst sys_refcursor;
BEGIN
  SELECT id INTO someId FROM someTable WHERE someColumn = 'someUniqueValue';
  OPEN p_lst FOR
  'SELECT * FROM someTable 
   where otherTableId = '||someId; 
END;

答案 2 :(得分:1)

您可以通过使用SQL * Plus

来实现
SQL> variable id number
SQL> begin
       select 1000 into :id from dual;
     end;
     /

SQL> print id

        ID
----------
      1000

SQL> SELECT * FROM tbl_a WHERE id = :id

在Oracle中,不允许您隐式返回查询结果。结果总是必须以某种方式显式返回。最简单的方法是使用DBMS_OUTPUT(大致相当于print)输出变量:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

但是,如果您尝试返回结果集,这并非常有用。在这种情况下,您要么返回集合或refcursor。但是,使用这些解决方案中的任何一个都需要将代码包装在函数或过程中,并从能够消耗结果的东西中运行函数/过程。以这种方式工作的函数可能如下所示:

CREATE FUNCTION my_function (myname in varchar2)
     my_refcursor out sys_refcursor
BEGIN
     open my_refcursor for
     SELECT *
     FROM   Customers
     WHERE  Name = myname;

     return my_refcursor;
END my_function;