2016-05-15 9 views
0

私はこのストアドプロシージャの作成に2つのテーブルを持っています。私はどのように合計を計算することができますか?

CREATE TABLE CAGE(
cageNo VARCHAR2(15) PRIMARY KEY NOT NULL, 
cageType VARCHAR2(50), 
description VARCHAR2(50), 
price FLOAT, 
status VARCHAR2 (50)); 


CREATE TABLE STAYRECORD(
stayRecID VARCHAR2(15) PRIMARY KEY NOT NULL, 
checkInDate DATE, 
checkOutDate DATE, 
cageNo VARCHAR2(15) REFERENCES CAGE(cageNo), 
animalID VARCHAR2(15) REFERENCES ANIMAL(animalID)); 

私はテーブルstayrecordからcheckindateとcheckoutdateに基づいて合計金額を計算することができますし、データベース内の合計を保存することなく、合計を表示するプロシージャを作成します。

CREATE OR REPLACE PROCEDURE calcTotal 
(p_checkInDate IN STAYRECORD.checkInDate%TYPE, 
p_checkOutDate IN STAYRECORD.checkOutDate%TYPE, 
p_stayRecID IN STAYRECORD.stayRecID%TYPE, 
p_cageNo IN STAYRECORD.cageNo%TYPE, 
p_cageNoC IN CAGE.cageNo%TYPE) 

IS 
TOTAL NUMBER; 

BEGIN 

TOTAL := 'select (to_date(checkOutDate) - to_date(checkInDate))*c.price'|| 
     'from STAYRECORD r, CAGE c'|| 
     'where r.cageNo = c.CAGENO AND r.STAYRECID = p_stayRecID'; 
DBMS_OUTPUT.PUT_LINE(TOTAL); 

END; 
/

私は上記の手順を作成して、ユーザーが挿入した日付に基づいて合計価格を計算しています。どのように私はPHPで計算された合計を取得するのですか?

答えて

0

合計を返す関数を書かないのはなぜですか?

CREATE OR REPLACE FUNCTION calcTotal 
    (p_checkInDate IN STAYRECORD.checkInDate%TYPE, 
    p_checkOutDate IN STAYRECORD.checkOutDate%TYPE, 
    p_stayRecID IN STAYRECORD.stayRecID%TYPE, 
    p_cageNo IN STAYRECORD.cageNo%TYPE, 
    p_cageNoC IN CAGE.cageNo%TYPE) 
    return number 
IS 
    TOTAL NUMBER; 
BEGIN 

    select (checkOutDate - checkInDate))*c.price 
    into total 
    from STAYRECORD r, CAGE c 
    where r.cageNo = c.CAGENO 
    AND r.STAYRECID = p_stayRecID; 

    return TOTAL; 

END; 
/

この手順には、クエリで使用されなかった多くのパラメータがあります。私はそれらを残しましたが、もしそれらが重複していれば、プログラムの署名から削除するべきです。

1

まず、結果を出力する必要があります。プロシージャーを使用する場合は、結果にOUTパラメーターが必要です。

p_total OUT numberパラメータをプロシージャ定義に追加します。

あなたの手順は、次のようになります。

<?php 
    $conn = oci_connect('your_conn_name', 'your_conn_password', 'localhost/XE'); 
    if (!$conn) { 
    $e = oci_error(); 
    trigger_error(htmlentities($e('message'), ENT_QUOTES), E_USER_ERROR); 
    } 

    $query = "begin 
       calcTotal(:check_in_date, 
         :check_out_date, 
         :stayRecId, 
         :cage_no, 
         :cageNoC, 
         :total_out); 
      end;"; 

    $stid = oci_parse($conn, $query); 

    $check_in =  /* put your data type here */; 
    $check_out = /* put your data type here */; 
    $stay_rec_id = /* put your data type here */; 
    $cage_no =  /* put your data type here */; 
    $cage_noc =  /* put your data type here */; 

    oci_bind_by_name($stid, ":check_in_date", $check_in); 
    oci_bind_by_name($stid, ":check_out_date", $check_out); 
    oci_bind_by_name($stid, ":stayRecId",  $stay_rec_id); 
    oci_bind_by_name($stid, ":cage_no",  $cage_no); 
    oci_bind_by_name($stid, ":cageNoC",  $cage_noc); 
    oci_bind_by_name($stid, ":total_out",  $total_result); 

    oci_execute($stid); 

    echo $total_result; 
?>` 
:あなたは以下のコードを使用することができますPHPで

CREATE OR REPLACE PROCEDURE calcTotal 
    (p_checkInDate IN STAYRECORD.checkInDate%TYPE, 
    p_checkOutDate IN STAYRECORD.checkOutDate%TYPE, 
    p_stayRecID IN STAYRECORD.stayRecID%TYPE, 
    p_cageNo IN STAYRECORD.cageNo%TYPE, 
    p_cageNoC IN CAGE.cageNo%TYPE, 
    p_total OUT number) 

IS 
BEGIN 

    p_total := 'select (to_date(checkOutDate) - to_date(checkInDate))*c.price'|| 
    'from STAYRECORD r, CAGE c'|| 
    'where r.cageNo = c.CAGENO AND r.STAYRECID = p_stayRecID'; 
    END; 
/

関連する問題