1

私は今、このクイズに少し取りつかれています。どうやら抜け道が見つからないようです...へへ。

見てみましょう - 2 つのテーブルがあります。

  • 俳優( 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

どのバージョンの SQL を使用しているかはわかりませんが、基本的には、次のように 2 つのテーブルを結合してクエリを実行する必要があります。

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 に答える
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 に答える
-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@

CALL SP1()

于 2015-10-06T05:34:56.367 に答える