我已尝试过所有内容,但Oracle 11g Express Edition为此过程提供了此错误。
错误(14,7):PLS-00049:错误的绑定变量
这是我的程序
create or replace procedure select_member_data
AS
memberdata MEMBER%rowtype;
member_ID MEMBER.MEMBER_ID%TYPE;
first_name MEMBER.FIRST_NAME%TYPE;
last_name MEMBER.LAST_NAME%TYPE;
address MEMBER.ADDRESS%TYPE;
total_rows number(2);
BEGIN
SELECT MEMBER_ID,first_name,last_name,address
INTO :memberdata
FROM MEMBER where member_id= 1 ;
IF sql%notfound THEN
dbms_output.put_line('no records fetched');
ELSIF sql%found THEN
dbms_output.put_line( total_rows ||' fetched');
END IF;
END;
这是我的表
CREATE TABLE MEMBER (
MEMBER_ID INT PRIMARY KEY,
LAST_NAME VARCHAR2(25) NOT NULL,
FIRST_NAME varchar2(25),
ADDRESS varchar2(100),
CITY varchar2(30),
PHONE varchar2(15),
JOIN_DATE date DEFAULT SYSDATE NOT NULL
);
答案 0 :(得分:3)
你在做:
SELECT MEMBER_ID,first_name,last_name,address
INTO :memberdata
...
但memberdata
是本地PL / SQL变量,而不是绑定变量,所以它应该是:
SELECT MEMBER_ID,first_name,last_name,address
INTO memberdata
...
您也没有在%rowtype
变量中获取足够的列。您的表有七列,因此您的memberdata
记录变量也有七个字段;但是你的查询只选择了四列 - 这还不够。 (有点令人困惑的是,这被报告为太多的值,而不是没有足够的值)。
您可以列出所有列名称,但这是一个罕见的情况,使用*
可能更好(或至少是合理的):
SELECT *
INTO memberdata
...
或者您已经定义了其他变量,您可以这样做:
SELECT MEMBER_ID,first_name,last_name,address
INTO member_ID, first_name, last_name, address
...
虽然我强烈建议你没有与列名相同的变量名;通常在局部变量前加上用于识别它们的东西,例如, l_member_id
。
但你的逻辑是有缺陷的。如果您的查询没有得到一行,那么将抛出无数据或太多行异常。 (由于这里的主键,你不能有多个,但你找不到)。 <{1}}检查将无法到达。