我正在使用Oracle SQL开发人员,我想创建一个过程来打印此SQL代码的结果:
SELECT Title , Name
FROM BOOK, BORROWER, BOOK_LOANS
WHERE Due_date = SYSDATE AND Return_date = NULL;
这是我的代码。我一直得到"忽略SQL语句,忽略语句,LOOP索引变量'书籍'无效"。请告诉我这里缺少什么。我尝试将SQL语句移动到游标,但它也不起作用。
CREATE OR REPLACE PROCEDURE overdueToday IS
BEGIN
FOR books IN (SELECT Title , Name
FROM BOOK, BORROWER, BOOK_LOANS
WHERE Due_date = SYSDATE
AND Return_date = NULL)
LOOP
DBMS_OUTPUT.put_line(books.Title || ' -- ' || books.Name);
END LOOP;
END overdueToday;
/
答案 0 :(得分:1)
除了你已被告知的内容(交叉连接)之外,WHERE条件不起作用。 SYSDATE
是一个返回日期和时间的函数,因此它不会返回任何内容。您应该使用TRUNC
功能。
此外,在处理NULL值时,它们与任何东西都不是“相等”(=) - 您应该使用IS NULL
(或IS NOT NULL
,具体取决于您的操作。)
以下示例是愚蠢的;你没有提供测试用例,所以我创建了自己的表,绝对最小的列集,只是为了确保程序不会失败。
SQL> create table book (title varchar2(20));
Table created.
SQL> create table borrower (name varchar2(20));
Table created.
SQL> create table book_loans (due_date date, return_date date);
Table created.
SQL>
SQL> insert into book values ('Pinky');
1 row created.
SQL> insert into borrower values ('Littlefoot');
1 row created.
SQL> insert into book_loans values (trunc(sysdate), null);
1 row created.
SQL>
程序;我标记了你应该注意的地方:
SQL> set serveroutput on;
SQL> create or replace procedure overduetoday
2 is
3 begin
4 for books in ( select title,
5 name
6 from book,
7 borrower,
8 book_loans
9 where due_date = trunc(sysdate) --> trunc!
10 and return_date is null --> is!
11 ) loop
12 dbms_output.put_line(books.title ||' -- '|| books.name);
13 end loop;
14 end overduetoday;
15 /
Procedure created.
SQL>
SQL> exec overduetoday;
Pinky -- Littlefoot
PL/SQL procedure successfully completed.
SQL>
正如你所看到的,工作(或者,我应该说,*不会失败“。如果这些表中有更多行,结果将是非常错误的。)< / p>
您提到的错误无法使用您发布的代码引发。这就是为什么发布完全你所做的事情很重要,就像我一样。这样做,毫无疑问,你拥有什么,你做了什么以及Oracle如何回应。其他任何事情只是一个猜测问题。
答案 1 :(得分:0)
如果你正在使用SQL Developer,你可以运行你的查询(点击 F5 或 Ctrl + Enter )。您不需要编写PL / SQL程序。
话虽如此,您的查询几乎肯定是错误的,因为您有三个表并且没有连接条件。但是你仍然应该得到一些输出。
答案 2 :(得分:0)
Oracle 12c及更高版本,您可以使用DBMS_SQL.RETURN_RESULT
。您需要在查询中使用正确的连接条件和别名,我们不知道。
CREATE OR replace PROCEDURE OverdueToday
IS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR
SELECT title, -- b.title ?
name -- br.name ?
FROM book b
join borrower br
ON ( 1 = 1 ) --Add proper join condition here
join book_loans bl
ON ( 1 = 1 ) --Add proper join condition here
WHERE due_date = TRUNC(SYSDATE)
AND return_date IS NULL;
DBMS_SQL.RETURN_RESULT(rc);
END overduetoday;
/
答案 3 :(得分:0)
这是在select语句中循环的简单方法:
CREATE OR REPLACE PROCEDURE overdueToday IS
CURSOR book_cur is
SELECT Title , Name
FROM BOOK, BORROWER, BOOK_LOANS
WHERE Due_date = SYSDATE
AND Return_date = NULL;
BEGIN
FOR book_rec IN book_cur loop
DBMS_OUTPUT.put_line(book_rec .Title || ' -- ' || book_rec .Name);
END LOOP;
END overdueToday;