使用 cursor/procedure/function 连接 2 个表
Join 2 tables using cursor/procedure/function
我有以下表格:
CREATE TABLE branch (
branch_code NUMBER,
branch_name VARCHAR2(80)
);
CREATE TABLE client (
client_nr NUMBER,
client_add VARCHAR2(40),
client_name VARCHAR2(60)
);
CREATE TABLE insurance (
account_no VARCHAR2(50),
insurance_type VARCHAR2(40),
insurace_company_code VARCHAR2(40),
company_details VARCHAR2(200)
);
CREATE TABLE credit (
account_no VARCHAR2(40),
branch_code NUMBER,
loan_amount FLOAT,
amount _to _refund FLOAT,
account_type VARCHAR2(30),
credit_type VARCHAR2(30),
interest_rate FLOAT,
client_nr NUMBER
);
--INTEGRITY CONSTRAINTS
ALTER TABLE branch ADD CONSTRAINT pk_branch PRIMARY KEY ( branch_code );
ALTER TABLE client ADD CONSTRAINT pk_client PRIMARY KEY ( client_nr );
ALTER TABLE credit
ADD CONSTRAINT fk_client_nr FOREIGN KEY ( client_nr )
REFERENCES client ( client_nr ) ON DELETE SET NULL;
ALTER TABLE credit
ADD CONSTRAINT fk_branch_code FOREIGN KEY ( branch_code )
REFERENCES branch ( branch_code ) ON DELETE SET NULL;
我必须使用 cursor/procedure/function 来确定每个客户的利率。
我目前在解决这个问题时遇到问题,因为我收到错误“ora-01422:exact fetch returns more than requested number of rows”。我使用 select 解决了这个问题声明,但我必须使用 function/procedure 或游标来完成我的作业。
这是我使用的 sql select 语句:
SELECT
client.client_nr,
nvl(interest_rate, 0) dobanda
FROM
credit
FULL OUTER JOIN client ON credit.client_nr = client.client_nr
ORDER BY
client.client_nr;
谢谢你不厌其烦地帮助我。
使用哪个 cursor/procedure/function?那么首先你需要清楚地了解这些是什么。以下是相当简化的版本。
- 游标是查询的结果。所以你提到的解决方案是
游标的必要前提。给定的游标具有特定的
询问。还有另一种称为参考游标的类型,它可以容纳
不同游标的结果(但必须解析为特定的
最终结果集定义)。通常,参考游标是
游标在 where defined/generated 时未处理
已处理 when/where 已定义。
- 过程或函数都是存储在数据库中的程序
并且可以根据需要使用。他们接近相同但有
不同的预期用途。简而言之,一个过程对
您的数据,一个函数检索信息。程序可以return
通过 OUT 参数的信息,但这不是预期用途,
虽然有时有用。函数必须 return 单个 'database'
目的。 SQL 通常可以调用其他函数,一个过程
无法从 SQL.
调用
示例过程处理光标
create or replace procedure client_credit_cursor
is
cursor c_client_credit is
select
client.client_nr,
nvl(interest_rate, 0) dobanda
from
client
left outer join credit
on credit.client_nr = client.client_nr
order by
client.client_nr;
client_cursor_rec c_client_credit%rowtype;
begin
open c_client_credit;
loop
-- process each row from cursor
fetch c_client_credit
into client_cursor_rec;
exit when c_client_credit%notfound;
-- process single rew returned by cursor
dbms_output.put_line( 'Client: ' || client_cursor_rec.client_nr ||
' Interest_rate: ' || client_cursor_rec.dobanda
) ;
end loop;
close c_client_credit;
end client_credit_cursor;
上面使用了所谓的显式游标。还有另一种变体称为隐式游标。我会把它留给你的研究。隐式游标通常是变体。
函数示例return引用游标。
create or replace function customer_credit_interest
return sys_refcursor
is
l_client_credit sys_refcursor;
begin
open l_client_credit for
select
client.client_nr,
nvl(interest_rate, 0) dobanda
from
client
left outer join credit
on credit.client_nr = client.client_nr
order by
client.client_nr;
return l_client_credit ;
end customer_credit_interest;
参见 fiddle here 每个和匿名块的示例 运行 它们。
我有以下表格:
CREATE TABLE branch (
branch_code NUMBER,
branch_name VARCHAR2(80)
);
CREATE TABLE client (
client_nr NUMBER,
client_add VARCHAR2(40),
client_name VARCHAR2(60)
);
CREATE TABLE insurance (
account_no VARCHAR2(50),
insurance_type VARCHAR2(40),
insurace_company_code VARCHAR2(40),
company_details VARCHAR2(200)
);
CREATE TABLE credit (
account_no VARCHAR2(40),
branch_code NUMBER,
loan_amount FLOAT,
amount _to _refund FLOAT,
account_type VARCHAR2(30),
credit_type VARCHAR2(30),
interest_rate FLOAT,
client_nr NUMBER
);
--INTEGRITY CONSTRAINTS
ALTER TABLE branch ADD CONSTRAINT pk_branch PRIMARY KEY ( branch_code );
ALTER TABLE client ADD CONSTRAINT pk_client PRIMARY KEY ( client_nr );
ALTER TABLE credit
ADD CONSTRAINT fk_client_nr FOREIGN KEY ( client_nr )
REFERENCES client ( client_nr ) ON DELETE SET NULL;
ALTER TABLE credit
ADD CONSTRAINT fk_branch_code FOREIGN KEY ( branch_code )
REFERENCES branch ( branch_code ) ON DELETE SET NULL;
我必须使用 cursor/procedure/function 来确定每个客户的利率。
我目前在解决这个问题时遇到问题,因为我收到错误“ora-01422:exact fetch returns more than requested number of rows”。我使用 select 解决了这个问题声明,但我必须使用 function/procedure 或游标来完成我的作业。
这是我使用的 sql select 语句:
SELECT
client.client_nr,
nvl(interest_rate, 0) dobanda
FROM
credit
FULL OUTER JOIN client ON credit.client_nr = client.client_nr
ORDER BY
client.client_nr;
谢谢你不厌其烦地帮助我。
使用哪个 cursor/procedure/function?那么首先你需要清楚地了解这些是什么。以下是相当简化的版本。
- 游标是查询的结果。所以你提到的解决方案是 游标的必要前提。给定的游标具有特定的 询问。还有另一种称为参考游标的类型,它可以容纳 不同游标的结果(但必须解析为特定的 最终结果集定义)。通常,参考游标是 游标在 where defined/generated 时未处理 已处理 when/where 已定义。
- 过程或函数都是存储在数据库中的程序 并且可以根据需要使用。他们接近相同但有 不同的预期用途。简而言之,一个过程对 您的数据,一个函数检索信息。程序可以return 通过 OUT 参数的信息,但这不是预期用途, 虽然有时有用。函数必须 return 单个 'database' 目的。 SQL 通常可以调用其他函数,一个过程 无法从 SQL. 调用
示例过程处理光标
create or replace procedure client_credit_cursor
is
cursor c_client_credit is
select
client.client_nr,
nvl(interest_rate, 0) dobanda
from
client
left outer join credit
on credit.client_nr = client.client_nr
order by
client.client_nr;
client_cursor_rec c_client_credit%rowtype;
begin
open c_client_credit;
loop
-- process each row from cursor
fetch c_client_credit
into client_cursor_rec;
exit when c_client_credit%notfound;
-- process single rew returned by cursor
dbms_output.put_line( 'Client: ' || client_cursor_rec.client_nr ||
' Interest_rate: ' || client_cursor_rec.dobanda
) ;
end loop;
close c_client_credit;
end client_credit_cursor;
上面使用了所谓的显式游标。还有另一种变体称为隐式游标。我会把它留给你的研究。隐式游标通常是变体。
函数示例return引用游标。
create or replace function customer_credit_interest
return sys_refcursor
is
l_client_credit sys_refcursor;
begin
open l_client_credit for
select
client.client_nr,
nvl(interest_rate, 0) dobanda
from
client
left outer join credit
on credit.client_nr = client.client_nr
order by
client.client_nr;
return l_client_credit ;
end customer_credit_interest;
参见 fiddle here 每个和匿名块的示例 运行 它们。