使用 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 每个和匿名块的示例 运行 它们。