1

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

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

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

我的意思是,是否可以使用程序来展示事物?我真的无法理解这个问题。

4

5 回答 5

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
于 2012-11-26T23:58:15.320 回答
0

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

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

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

请参阅PL/SQL 文档中的示例。

于 2012-11-27T00:17:23.280 回答
0

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

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

完毕 :-)

于 2012-11-25T19:29:12.697 回答
0

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

--    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 
于 2015-10-06T06:48:01.650 回答
-1
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()

于 2015-10-06T05:34:56.367 回答