SQL非常棘手的程序

时间:2012-11-25 18:53:04

标签: sql database oracle procedure

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

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

  • 演员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;

我的意思是,是否可以使用程序显示内容?我真的无法理解这个问题。

5 个答案:

答案 0 :(得分:0)

我真的不知道您正在使用哪个版本的SQL,但实质上,您将要加入两个表并从中查询,如下所示:

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

完成: - )

答案 1 :(得分:0)

这是一个简单的连接:

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

答案 2 :(得分:0)

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

然后,您可以使用dbms_output.put_line()输出您的程序结果,假设您已SERVEROUTPUT开启。

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

请参阅PL/SQL documentation中的示例。

答案 3 :(得分:0)

您可以使用pipepline函数来实现此目的。

--    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 

答案 4 :(得分:-1)

subtitle: {
        text: '$2567 mm',
        align: 'center',
        verticalAlign: 'middle',
        y: 0,
        useHTML: true
    }

CALL SP1()