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