oracle - 从oracle sql中的表中获取数据

标签 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 ”或“史密斯”)时,我的程序崩溃并给出错误,表明我的 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;

有人可以帮助我指导我如何正确获取数据吗?我不允许创建任何临时表或 View 。 我很抱歉让问题变得比应有的时间更长,但我试图尽可能清楚地解释问题。

提前谢谢您。

最佳答案

如果错误是 “ORA-01422 精确获取返回的行数超过请求的行数”那么我认为您的答案就在这里 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:981494932508

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

for x in ( select * from t where ... ) 环形 -- 在这里处理X记录 结束循环;

关于oracle - 从oracle sql中的表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35530880/

相关文章:

java - 将 VARRAY 与 JDBC 和 PL/SQL 存储过程一起使用的新手简单示例

oracle - PLSQL 将变量传递给外部 .SQL 脚本

oracle - 批量收集动态sql

java - hibernate 和 oracle 序列 GenericGenerator 造成差距

oracle - 如何在oracle触发器中获取准确更新的列名称?

oracle - 未在规范中声明就无法调用 Oracle 包函数

vb.net - 无法在合并语句中捕获错误

java - SQL 查询仅返回 SELECT 语句中第一列的值

python-3.x - 如何在 Microsoft Azure 上配置 Oracle Driver Manager?

plsql - 字符串范围是正确的,为什么还是得到 PLS-00215 : String length constraints must be in range (1 . .32767)