从oracle sql中的表中获取数据

从oracle sql中的表中获取数据,oracle,plsql,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

数据库中有两个表,第一个是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;
有人能帮我指导我如何正确获取数据吗?我不允许创建任何临时表或视图。 很抱歉,我把问题拖得太长了,但我在解释问题时尽量说清楚

先谢谢你

如果错误是 ORA-01422 exact fetch返回的行数超过请求的行数,那么我认为您的答案在这里

如果希望查询返回多行,则应编写以下代码:

对于x,从t中选择*其中。。。 环 -在这里处理X记录
端环

您当前的问题是将匹配的person\u 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逻辑中。不过,这取决于任务的细节,以及它希望您在这两种或所有三种情况下返回数据的方式


也有可能你不希望碰到这个问题——不清楚任务是找到所有员工,还是只找到飞行员。一般来说,这个问题仍然存在,但是根据您显示的数据,没有任何重复的飞行员姓氏。如果你还没有了解到这种错误,也许你比导师期望的要早一点。

完全外部连接是不必要的,因为FK意味着你不能有一个不是人的飞行员。对于多个匹配项,作业期望得到什么?当没有匹配项时,如何返回所有数据?这种机制对许多人和两个人都是一样的。一个人也可以是一样的。从您显示的内容来看,您的v_n应该是行数,而不是特定的ID。。。