簡體   English   中英

我怎樣才能在php中調用在過程中計算的總數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM