Plsql PL/SQL在不应该输入绑定时要求输入绑定

Plsql PL/SQL在不应该输入绑定时要求输入绑定,plsql,Plsql,我在PL/SQL代码中遇到了一些可能很小的错误。我正在写一个程序,需要在虚拟图书馆系统中租一本虚拟书。当我执行这个过程时,它要求我输入bind,并且不应该有bind。如果我按OK,这是我得到的错误: PLS-00049: bad bind variable 'DBMS_OUTPUT.PUT_LINE' 似乎无法找出错误在哪里 这是我的密码: CREATE OR REPLACE PROCEDURE dr_rent_book( f_member_id dr_library_rental.m

我在PL/SQL代码中遇到了一些可能很小的错误。我正在写一个程序,需要在虚拟图书馆系统中租一本虚拟书。当我执行这个过程时,它要求我输入bind,并且不应该有bind。如果我按OK,这是我得到的错误:

PLS-00049: bad bind variable 'DBMS_OUTPUT.PUT_LINE'
似乎无法找出错误在哪里

这是我的密码:

CREATE OR REPLACE PROCEDURE dr_rent_book(
    f_member_id dr_library_rental.member_id%TYPE,
    f_isbn dr_library_rental.isbn%TYPE
) IS 
    v_is_member NUMBER := dr_is_active_member(f_member_id);
    v_num_already_rented NUMBER := dr_num_rented_books(f_member_id);
    v_book_min_copy dr_library_books_copy.copy_id%TYPE;
BEGIN 
    IF v_is_member = 0 THEN -- Not a valid membership
        dbms_output.put_line('Your membership has expired!');
    ELSIF v_is_member = 1 THEN 
        IF v_num_already_rented >= 3 THEN -- Can't rent another book
            dbms_output.put_line('You already have 3 rented books, return one of those first.');
        ELSE -- Valid member and can rent book 
            SELECT MIN(copy_id) INTO v_book_min_copy 
            FROM dr_library_books_copy 
            WHERE isbn = f_isbn 
            AND status = 'AVAILABLE';
            IF v_book_min_copy IS NOT NULL THEN -- Exists
                UPDATE dr_library_books_copy 
                SET status = 'RENTED' 
                WHERE isbn = f_isbn 
                AND copy_id = v_book_min_copy;
                INSERT INTO dr_library_rental(copy_id, member_id, isbn, issued_date, exp_return_date, return_date)
                    VALUES(v_book_min_copy, f_member_id, f_isbn, SYSDATE, SYSDATE + 15, NULL);
                COMMIT;    
                dbms_output.put_line('The book ' || f_isbn || ' is now rented by ' || f_member_id);
            ELSE:
                dbms_output.put_line('No copies of that book currently available, we will reserve it for you!');
                dr_reserve_book(f_member_id, f_isbn);
            END IF;
        END IF;
    END IF;    
EXCEPTION 
    WHEN OTHERS THEN 
     dr_exception_handler(SQLCODE, 'rent_book');    
END dr_rent_book;
如果dr_为活动成员,则成员为:

CREATE OR REPLACE FUNCTION dr_is_active_member(
    f_member_id dr_library_members.member_id%TYPE
) RETURN NUMBER IS 
    v_end_date dr_library_members.membership_end_date%TYPE;
    v_is_active NUMBER(1);
BEGIN 
    SELECT membership_end_date 
    INTO v_end_date
    FROM dr_library_members 
    WHERE member_id = f_member_id;
    IF SYSDATE <= v_end_date THEN 
         v_is_active := 1;
    ELSE 
         v_is_active := 0;
    END IF;
    RETURN v_is_active;
END dr_is_active_member;

有人能帮我调试一下吗?

这里有一个冒号-其他:。它应该是ELSE,并且:使编译器认为下一行是绑定变量,在本例中是DBMS_OUTPUT.PUT_行


要解决此问题,只需删除冒号。

是的,Python用户正在处理SQL。这是可行的,请把它写下来作为一个答案,这样我就可以接受了。顺便说一下,dr_exception_handler可以轻松地为自己读取sqlcode和失败过程的名称,而不需要向其中传递任何信息。
CREATE OR REPLACE FUNCTION dr_num_rented_books(
    f_member_id dr_library_rental.member_id%TYPE
) RETURN NUMBER IS 
    v_num_rented NUMBER(1);
BEGIN 
    SELECT COUNT(copy_id) 
    INTO v_num_rented 
    FROM dr_library_rental 
    WHERE member_id = f_member_id;
    RETURN v_num_rented;
END dr_num_rented_books;