创建表:
create table customer (Name varchar2(10), Address varchar(40), Contact number);
为INSERT创建程序:
CREATE OR REPLACE PROCEDURE SP_CUSTOMER (
p_name customer.Name%TYPE,
p_address customer.Address%TYPE,
p_contact customer.Contact%TYPE)
IS
BEGIN
INSERT INTO customer ("Name", "Address", "Contact")
VALUES (p_name, p_address, p_contact);
COMMIT;
END;
/
错误: IT显示:警告:使用编译错误创建过程。
CREATE PROCEDURE FOR SELECT:
CREATE OR REPLACE PROCEDURE SP_SELECT_CUSTOMER (
p_name customer.Name%TYPE,
p_address customer.Address%TYPE,
p_contact customer.Contact%TYPE)
IS
BEGIN
SELECT Name, Address, Contact FROM customer;
END;
/
错误: IT显示:警告:使用编译错误创建过程。
问题是什么?如何解决呢?
答案 0 :(得分:8)
每当你在SQL * Plus中编译某些东西并得到“编译错误”时,你要做的第一件事就是SHOW ERRORS
,它会告诉你实际出了什么问题。
您的第一个过程存在一个问题,即列名与表中的列名不匹配。您的表定义包含Name
,Address
和Contact
,但由于您没有使用双引号,因此列名称实际上为NAME
,ADDRESS
和CONTACT
- 但你的insert语句使用双引号,因此它会尝试插入Name
等。只需删除双引号,你就不需要它们了。
在第二个过程中,PL / SQL中有一个SELECT语句,但是没有指定将结果数据放在何处。您至少需要一个INTO
子句,或者对结果记录执行LOOP。
答案 1 :(得分:1)
- 您无需将列放在引号
中CREATE OR REPLACE PROCEDURE SP_CUSTOMER (
p_name customer.Name%TYPE,
p_address customer.Address%TYPE,
p_contact customer.Contact%TYPE)
IS
BEGIN
INSERT INTO customer (Name, Address, Contact)
VALUES (p_name, p_address, p_contact);
COMMIT;
END;
/
- 只需使用refcursor返回结果集
CREATE OR REPLACE PROCEDURE SP_SELECT_CUSTOMER (
p_cust_details OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_cust_details for SELECT Name, Address, Contact FROM customer;
END;
/
编辑如果您想根据名称查找详细信息,请传递IN参数并将其用作过滤条件。
CREATE OR REPLACE PROCEDURE SP_SELECT_CUSTOMER (
p_cust_name IN customer.Name%TYPE
p_cust_details OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_cust_details for SELECT Name, Address, Contact FROM customer
WHERE name=p_cust_name ;
END;
/
答案 2 :(得分:0)
select * from user_errors where name='SP_SELECT_CUSTOMER'