2016-06-23 10 views
0

ここでは奇妙な問題に直面しています。sqldeveloperとjavaでは正常に動作するoracleストアドプロシージャを使用しようとしますが、PHPでは動作しません。ORACLEストアドプロシージャはSQL Developerで動作しますが、PHPでは動作しません

私は、クエリをこのように実行しています:

//$rqt_date = "SELECT DECODE(1, NULL, 1, 33, '1', 44) as test FROM DUAL"; 
$rqt_date = "SELECT DATEPARAM('23/06/2016') as date_1900 FROM DUAL"; 

$parsed = ociparse($db_link, $rqt_date); 
oci_execute($parsed,OCI_NO_AUTO_COMMIT); 
while (($row = oci_fetch_array($parsed, OCI_BOTH)) != false) 
{ 
    print_r($row); 
} 

私がコメントし$rqt_date(デコード)を使ってテスト:私は

Array 
(
    [0] => 44 
    [TEST] => 44 
) 

結果を得るしかし、私はDATEPARAMを使用するとき、私は値として0を取得42542の代わりに(1900年以降の日数):

Wha tは私がのsqldeveloperで取得:

http://i.stack.imgur.com/6b40V.png

私はPHPのログにエラーを持っていません。

私のサーバーに関する情報: PHPバージョン5.3.8 システムWindows NT BOWSER 6.1ビルド7601(のWindows Server 2008 R2 Standard Editionのサービスパック1)のi586

+0

SQL文でプロシージャを使用することはできません。 PL/SQLブロック内にある必要があります。プロシージャではなくストアド関数ではないと確信していますか? – MT0

+0

'DATEPARAM'関数のソースコードを投稿できますか? – MT0

+0

'23/06/2016 'の代わりにto_date('23/06/2016'、 'dd/mm/yyyy' – Mottor

答えて

0

しかし、私はDATEPARAM Iを使用する場合取得[...] 1900

DATEPARAM機能からの日数は、非常に単純でなければなりません:

CREATE FUNCTION dateparam (
    dt IN DATE 
) RETURN INTEGER DETERMINISTIC 
IS 
BEGIN 
    RETURN dt - DATE '1900-01-01'; 
END; 
/

これはDATEというデータ型(文字列ではありません)をとります。 PHPでそう

(ない私の言語なので、すべてのエラーを言い訳してください)あなたはバインド変数として必要な値を渡すことができます:

$rqt_date = "BEGIN :r := DATEPARAM(:dt); END;"; 
$parsed = ociparse($db_link, $rqt_date); 
oci_bind_by_name($parsed, ":dt", new DateTime("2016-06-23")); 
oci_bind_by_name($parsed, ":r", $r, 40); 
oci_execute($parsed,OCI_NO_AUTO_COMMIT); 
print "$r\n"; 
0

は、あなたの答えをいただき、ありがとうございます。ここで

は、関数のコードである(それはあなたが正しい、手順はありません)

create or replace function DateParam(strDate in varchar) return number DETERMINISTIC is 
Result number := 0; 
begin 
If Length (strDate) >=4 Then 
    Result := to_date(strDate) - to_date('01/01/1900'); 
End If; 
return(Result); 
exception 
when others then 
    return (0); 
end DateParam; 

それは本当にあなたが書いたtheoneのように見えます。

I 'が代わりに'23/06/2016' TO_DATE('23/06/2016' 、' DD/MM/YYYY)と試み、それはまだ同じ=> 0

BUUUUUT

です

あなたが書いた機能はうまくいきます!

だから我々は

to_date(strDate, 'dd/MM/yyyy') - to_date('01/01/1900','dd/MM/yyyy'); 

そして今、それがうまく働いているに私たちから

to_date(strDate) - to_date('01/01/1900'); 

を変更しました。

それはPHPで働いていなかった私はなぜ

ありがとう...(それはのsqldeveloperで動作するので、もし、それがどこでも働くべきか、私たちが行ったすべての変更は関数自体にある)理解していませんあなたのご両親よ!

関連する問題