使用变量的Oracle SQL问题

时间:2013-03-14 01:38:10

标签: sql oracle plsql

这里有一些简单的问题,但是我已经花了这么多时间而难以集中注意力,所以希望有新头脑的人可以回答这个简单的问题,我似乎无法找到一个对我有用的好答案SQL Developer

DECLARE
  TEST123 NUMBER;
BEGIN
  SELECT COUNT(APP_ID) INTO TEST123 FROM applicant_credit;
  SELECT * FROM APPLICANT_CREDIT;
END;

当我运行这个对我来说似乎很容易的时候我会收到错误:

错误报告: ORA-06550:第5行,第3栏: PLS-00428:此SELECT语句中需要一个INTO子句 06550. 00000 - “行%s,列%s:\ n%s” *原因:通常是PL / SQL编译错误。

此外,我发送了一个存储过程,当我发送硬编码的数字时,它会工作,但是我需要传递来自之前查询中提到的applicant_credit的记录计数,这是我实际上正在追求的。执行存储过程在上面的块中是否与块外部相同。那么这应该工作吗?

DECLARE
  TEST123 NUMBER;
BEGIN
  SELECT COUNT(APP_ID) INTO TEST123 FROM applicant_credit;
  EXECUTE UPDATE_DECISION(102, 1, 1, 1, 1, TEST123);
  SELECT * FROM APPLICANT_CREDIT;
END;

当我跑步时,我得到:

错误报告: ORA-06550:第5行,第11栏: PLS-00103:遇到以下任何一种情况时遇到符号“UPDATE_DECISION”:

:=。 (@%;立即 符号“:=”代替“UPDATE_DECISION”继续。

在这里碰壁,任何帮助都表示赞赏!!

2 个答案:

答案 0 :(得分:2)

对于第一个sql语句,您将收到该错误,因为您无法以这种方式在plsql块中执行select *语句。您可以使用游标或批量收集语句或任何其他方式将select *的输出“重定向”到记录集合中。

DECLARE
  TEST123 NUMBER;
  cursor c_cur
  is select col_1, col_2 from application_credit;
BEGIN
  SELECT COUNT(APP_ID) INTO TEST123 FROM applicant_credit;
  -- loop through the cursor if required
END;

你的第二个sql语句给出了一个错误,因为你不能在plsql块中使用execute语句(除非它是execute immediate,这是完全不同的)。因此,您可以按如下方式修改代码: -

DECLARE
  TEST123 NUMBER;
  cursor c_cur is
  select col1, col2 from applicant_credit;
BEGIN
  SELECT COUNT(APP_ID) INTO TEST123 FROM applicant_credit;
  UPDATE_DECISION(102, 1, 1, 1, 1, TEST123);
  -- loop through the cursor if required
END;

一些有用的链接: -

http://www.techonthenet.com/oracle/cursors/declare.php

http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html

答案 1 :(得分:0)

除非您正在尝试学习它,否则根本不需要PL / SQL。所有这些都只能用SQL完成。

DECLARE
  TEST123 NUMBER:= 0;
BEGIN
  UPDATE_DECISION(102, 1, 1, 1, 1, TEST123);

 -- The outer query is not required, this is only to show you the correct syntax.
  SELECT * INTO TEST123 -- you are selecting from applicant_credit
    FROM 
   (
    SELECT COUNT(app_id) FROM applicant_credit
   );
END;
/