从oracle sql

时间:2016-02-21 00:38:16

标签: oracle plsql

我在数据库中有两个表,第一个是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;

有人可以帮助我指导我如何正确获取数据吗?我不允许创建任何临时表或视图。 我很抱歉让问题变得比它应该的更长,但我在解释这个问题时尽量保持清醒。

提前谢谢你。

2 个答案:

答案 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 姓氏。如果您还没有了解到这种错误,那么您可能会比导师期望的要早一点。