我在数据库中有两个表,第一个是Person,第二个是Pilot。如下:
人员表:
CREATE TABLE person(
person_id NUMBER PRIMARY KEY,
last_name VARCHAR2(30) NOT NULL,
first_name VARCHAR2(30) NOT NULL,
hire_date VARCHAR2(30) NOT NULL,
job_type CHAR NOT NULL,
job_status CHAR NOT NULL
);
/
INSERT INTO person VALUES (1000, 'Smith', 'Ryan', '04-MAY-90','F', 'I');
INSERT INTO person VALUES (1170, 'Brown', 'Dean', '01-DEC-92','P', 'A');
INSERT INTO person VALUES (2010, 'Fisher', 'Jane', '12-FEB-95','F', 'I');
INSERT INTO person VALUES (2080, 'Brewster', 'Andre', '28-JUL-98', 'F', 'A');
INSERT INTO person VALUES (3190, 'Clark', 'Dan', '04-APR-01','P', 'A');
INSERT INTO person VALUES (3500, 'Jackson', 'Tyler', '01-NOV-05', 'F', 'A');
INSERT INTO person VALUES (4000, 'Miller', 'Mary', '11-JAN-08', 'F', 'A');
INSERT INTO person VALUES (4100, 'Jackson', 'Peter', '08-AUG-11', 'P','I');
INSERT INTO person VALUES (4200, 'Smith', 'Ryan', '08-DEC-12', 'F','A');
COMMIT;
/
试点表:
CREATE TABLE pilot(
person_id NUMBER PRIMARY KEY,
pilot_type VARCHAR2(100) NOT NULL,
CONSTRAINT fk_person_pilot FOREIGN KEY (person_id)
REFERENCES person(person_id)
);
/
INSERT INTO pilot VALUES (1170, 'Commercial pilot');
INSERT INTO pilot VALUES (2010, 'Airline transport pilot');
INSERT INTO pilot VALUES (3500, 'Airline transport pilot');
COMMIT;
/
我被要求编写一个pl / sql代码块,接受用户的姓氏并返回结果如下: 1)如果姓氏不在表中,则返回表中的所有行。 2)如果姓氏在表格中,则显示员工的所有信息。
到目前为止,我对代码做得很好,但是我遇到了两个姓氏的员工。这是我写的光标:
cursor person_info is
select last_name, first_name, hire_date, job_type, job_status, nvl(pilot_type, '-----------')
from person
full outer join pilot
on person.person_id = pilot.person_id
where upper(last_name) = upper(v_last_name)
group by last_name, first_name, hire_date, job_type, job_status, pilot_type
order by last_name, first_name, hire_date asc;
逻辑上,有三种情况需要涵盖: 第一种情况,当输入的姓氏在表中时,我返回表中的所有行并完成。 第二种情况是只有一名员工输入了姓氏,这种情况也是如此。最后一种情况是,在这种情况下,有多个员工具有相同的姓氏,例如'Jackson'或'Smith',我的程序崩溃并且给出了我的select into语句返回多行的错误。
select person_id
into v_n
from person
where upper(last_name) = upper(v_last_name);
if v_n = 1 then
open person_info;
fetch person_info into v_last_name, v_first_name, v_hire_date, v_job_type, v_job_status, v_pilot_type;
有人可以帮助我指导我如何正确获取数据吗?我不允许创建任何临时表或视图。 我很抱歉让问题变得比它应该的更长,但我在解释这个问题时尽量保持清醒。
提前谢谢你。
答案 0 :(得分:1)
如果错误是 “ORA-01422完全提取返回超过请求的行数”然后我认为您的答案在getElementById()
如果您对查询进行EXPECT以返回多行,则应编码:
for x in(select * from t where ...) 环 - 在这里处理X记录 结束循环;
答案 1 :(得分:1)
您的直接问题是,您正在选择匹配的person_id
到变量中,然后查看该特定ID是否为1.您仍然没有实际ID 1,因此检查永远不会匹配;但它是查询匹配多行获取错误,因为您不能将两个匹配的ID放入单个标量变量。
您构建它的方式看起来像是在尝试计算有多少匹配的行,而不是查找特定的ID:
select count(person_id)
into v_n
from person
where upper(last_name) = upper(v_last_name);
if v_n = 1 then
....
如果您有多个匹配项,那么您将需要使用相同的机制来返回所有这些,如果没有匹配项并返回所有员工。您可能会发现逻辑应该在游标查询中,而不是在PL / SQL逻辑中。它取决于赋值的细节,以及它希望您在两种(或所有三种)场景中返回数据的方式。
你也可能不会遇到这个问题 - 目前尚不清楚作业是找到所有员工,还是只找到那些飞行员。问题仍然存在,但是您显示的数据没有任何重复的 pilot 姓氏。如果您还没有了解到这种错误,那么您可能会比导师期望的要早一点。