[英]how can i call total calculated in procedure in php
我有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中計算的總數?
首先,您需要輸出結果。 如果使用過程,則結果中應包含一個OUT
參數。
將p_total OUT number
參數添加到您的過程定義中。
您的過程應如下所示:
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;
/
在PHP中,您可以使用以下代碼:
<?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;
?>`
為什么不編寫一個返回總數的函數呢?
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;
/
該過程有很多您的查詢未使用的參數。 我已經把它們留在了,但是如果它們多余,則應該從程序的簽名中刪除它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.