创建一个过程来打印结果和SQL查询

时间:2018-03-24 00:09:57

标签: oracle plsql

我正在使用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;
/

4 个答案:

答案 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;