【问题标题】:SQL very tricky procedureSQL 很棘手的程序
【发布时间】:2012-11-25 18:53:04
【问题描述】:

我现在对这个测验有点痴迷,似乎找不到出路……呵呵。

让我们看看 - 我们有两个表:

  • 演员 (id, salary, bonus)
  • 信息 (id, name, surname)

问题是,要创建一个程序,以便显示演员的salary, bonus, name, surname 以及他的最终薪水 = (bonus + salary)。

首先我尝试了这个:(只是为了显示salary, bonus, name, surname 而不是总薪水,但它失败了很多次)。

create or replace procedure show_things AS
BEGIN 
   Select a.id, a.salary, a.bonus 
   From actor a
   where  a.id in 
               (select i_id, i.name, i.surname 
                from info i 
                where i_id = a_id);
END;

我的意思是,是否可以使用过程来展示事物?这个问题我实在看不懂。

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法高亮它!这样一来,您也不需要任何 <br> 标记和这些乱七八糟的东西!
  • 感谢您的信息伙伴。确实,真的很乱。
  • 嗯不是真的,这不是我要求的。

标签: sql database oracle procedure


【解决方案1】:

我真的不知道您使用的是哪个版本的 SQL,但本质上,您会想要连接两个表并从中查询,如下所示:

SELECT
     actor.salary,
     actor.bonus,
     info.name,
     info.surname,
     actor.salary + actor.bonus AS total_pay
FROM actor INNER JOIN info;

完成:-)

【讨论】:

  • JOIN 需要一个 ON 子句。
  • 或者它需要一个逗号而不是 INNER JOIN 并带有一个适当的 where 子句,如 WHERE actor.id = info.id
  • 哎呀。我会把它变成一个社区 wiki,你们可以根据需要编辑它。
【解决方案2】:

这是一个简单的连接:

SELECT
     a.id,
     a.salary,
     a.bonus,
     i.name,
     i.surname,
     a.salary + a.bonus AS final_paycheck
FROM 
     actor a INNER JOIN info i
ON 
     a.id= i.id

【讨论】:

    【解决方案3】:

    您的程序不会按原样编译。您将(至少)需要定义一些局部变量,并使用INTO 子句来选择它们。

    然后您可以使用dbms_output.put_line() 输出您的过程的结果,假设您打开了SERVEROUTPUT

    此外,您不能将IN 运算符与列数 (1) 与它引用的子查询 (3) 中的列数 (3) 不同。您应该按照其他人的建议使用简单的JOIN

    请查看PL/SQL documentation中的示例。

    【讨论】:

      【解决方案4】:

      您可以使用管道功能来实现这一点。

      --    drop type t_actor_tab;
      --    drop type t_actor_obj;
      --    drop function get_actor_ptf;
      --    drop table ACTOR;
      --    drop table info;
      
      CREATE TABLE ACTOR(ID NUMBER, SAL NUMBER, BONUS NUMBER);
      INSERT INTO ACTOR(ID, SAL, BONUS) VALUES(1, 1200, 120);
      INSERT INTO ACTOR(ID, SAL, BONUS) VALUES(2, 1300, 240);
      INSERT INTO ACTOR(ID, SAL, BONUS) VALUES(3, 1500, 120);
      
      CREATE TABLE INFO(ID NUMBER, NAME VARCHAR2(30), SURNAME VARCHAR2(30));
      INSERT INTO INFO(ID, NAME, SURNAME) VALUES(1, 'ABC', 'abc');
      INSERT INTO INFO(ID, NAME, SURNAME) VALUES(2, 'xyz', 'xyz');
      INSERT INTO INFO(ID, NAME, SURNAME) VALUES(3, 'MNO', 'mno');
      
      
      CREATE TYPE t_actor_obj AS OBJECT (
            id           NUMBER
           ,sal       NUMBER
           ,bonus        NUMBER
           ,final_paycheck NUMBER
          );  
      
      CREATE TYPE t_actor_tab IS TABLE OF t_actor_obj;
      
      
      
      CREATE OR REPLACE FUNCTION get_actor_ptf 
          RETURN t_actor_tab PIPELINED AS
      
          CURSOR get_details_cur
          IS 
           SELECT a.id
                 ,a.sal
                 ,a.bonus
                 ,(a.sal+a.bonus) final_paycheck
          From actor a
          where  EXISTS(SELECT 1 FROM info i WHERE i.id = a.id);
      
         v_details_row  get_details_cur%ROWTYPE;
          BEGIN
            OPEN get_details_cur;
            LOOP
              FETCH get_details_cur INTO v_details_row;
              EXIT WHEN get_details_cur%NOTFOUND;
                 PIPE ROW(t_actor_obj (v_details_row.id,v_details_row.sal,v_details_row.bonus,v_details_row.final_paycheck));   
            END LOOP;
            CLOSE get_details_cur;
      
            RETURN;
          END;
          /
      
       SELECT * FROM   TABLE(get_actor_ptf);
      
              ID        SAL      BONUS FINAL_PAYCHECK
       ---------- ---------- ---------- --------------
           1       1200        120           1320 
           2       1300        240           1540 
           3       1500        120           1620 
      

      【讨论】:

        【解决方案5】:
        CREATE TABLE ACTOR(ID BIGINT, SAL BIGINT, BONUS BIGINT);
        INSERT INTO ACTOR(ID, SAL, BONUS) VALUES(1, 1200, 120), (2, 1300, 240),(3, 1500, 120);
        
        CREATE TABLE INFO(ID BIGINT, NAME VARCHAR(30), SURNAME VARCHAR(30));
        INSERT INTO INFO(ID, NAME, SURNAME) VALUES(1, 'ABC', 'abc'), (2, 'xyz', 'xyz'), (3, 'MNO', 'mno')
        
        SELECT * FROM ACTOR
        SELECT * FROM INFO
        
        CREATE OR REPLACE PROCEDURE SP1()
        LANGUAGE SQL
        DYNAMIC RESULT SETS 1
        BEGIN
        
        DECLARE DISPLAY CURSOR WITH RETURN FOR
        SELECT X.ID, Y.NAME, Y.SURNAME, X.SAL, X.BONUS, X.SAL + X. BONUS AS TOTAL FROM ACTOR X JOIN INFO Y ON X.ID = Y. ID ;
        OPEN DISPLAY;
        
        END@
        

        调用 SP1()

        【讨论】:

          猜你喜欢
          • 2018-03-14
          • 1970-01-01
          • 2011-08-16
          • 1970-01-01
          • 2021-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-12
          相关资源
          最近更新 更多