はPHP

2017-01-06 4 views
4

からOracleのストアドプロシージャを呼び出し、私は私の手順か​​らデータを実行して取得しようとしています:ここではPHP

は私の手順が定義されている方法である:ここでは

create or replace PROCEDURE SP_GET_MY_DATA(
     IN_POP VARCHAR2, 
     IN_SEG VARCHAR2, 
     IN_DUR VARCHAR2, 
     IN_VIEW INTEGER, 
     IN_PAGE INTEGER, 
     VIEW_DATA_CUR OUT SYS_REFCURSOR) AS ... 

は私のPHPコードを実行して取得することです手順からのデータ:

$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = JXYX.com)(PORT = 1521)))(CONNECT_DATA=(SID=DHSJKS)))"; 
$conn = ocilogon("XXXXXX","XXXXXXXX",$db);   

$sql = 'BEGIN SP_GET_MY_DATA(:POP, :SEG, :DUR, :VIEW, :PAGE, :OUTPUT_CUR); END;';    

$stmt = oci_parse($conn,$sql);      
oci_bind_by_name($stmt,':POP',$pop);   
oci_bind_by_name($stmt,':SEG',$seg);   
oci_bind_by_name($stmt,':DUR',$dur);   
oci_bind_by_name($stmt,':VIEW',$view);   
oci_bind_by_name($stmt,':PAGE',$page);   
$OUTPUT_CUR = oci_new_cursor($conn); 
oci_bind_by_name($stmt,":OUTPUT_CUR", $OUTPUT_CUR, -1, OCI_B_CURSOR);     
oci_execute($stmt, OCI_DEFAULT); 

while ($data = oci_fetch_assoc($OUTPUT_CUR)) { 
    print_r($data); 
} 

しかし、そうすることで、私はこのエラーを取得しています:

oci_fetch_assoc(): ORA-24374: define not done before fetch or execute and fetch".

私は何が欠けているのか理解できません。手伝ってくれますか?

+0

に基づいています – x01saa

答えて

7

PHPでカーソルを操作するには、SELECTステートメントから直接行にアクセスするのに比べて3つの追加ステップが必要です。

  • 最初のステップは、oci_new_cursor()関数を使用してPHPでカーソルリソースを準備してから、適切なパラメータにバインドすることです。
  • 第2のステップは、あなたが通常のSQL文を実行した後、oci_bind_by_name()機能
  • 第三段階にパラメータを追加することで、カーソルのリソースにoci_execute()を呼びかけています。

コード:

//Connection does not change 
$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = JXYX.com)(PORT = 1521)))(CONNECT_DATA=(SID=DHSJKS)))"; 
$conn = ocilogon("XXXXXX","XXXXXXXX",$db);   

//Request does not change 
$sql = 'BEGIN SP_GET_MY_DATA(:POP, :SEG, :DUR, :VIEW, :PAGE, :OUTPUT_CUR); END;';    

//Statement does not change 
$stmt = oci_parse($conn,$sql);      
oci_bind_by_name($stmt,':POP',$pop);   
oci_bind_by_name($stmt,':SEG',$seg);   
oci_bind_by_name($stmt,':DUR',$dur);   
oci_bind_by_name($stmt,':VIEW',$view);   
oci_bind_by_name($stmt,':PAGE',$page);  

//But BEFORE statement, Create your cursor 
$cursor = oci_new_cursor($conn) 

// On your code add the latest parameter to bind the cursor resource to the Oracle argument 
oci_bind_by_name($stmt,":OUTPUT_CUR", $cursor,-1,OCI_B_CURSOR); 

// Execute the statement as in your first try 
oci_execute($stmt); 

// and now, execute the cursor 
oci_execute($cursor); 

// Use OCIFetchinto in the same way as you would with SELECT 
while ($data = oci_fetch_assoc($cursor, OCI_RETURN_LOBS)) { 
    print_r($data} 
} 

私は、Oracle(英語)と非常に流暢ではないよ、あなたはthis tutorialをお読みください。興味深い例があります。ストアドプロシージャとリファレンスカーソルの章を見てください!

希望すると助かります!

1

この例では、 `$のstmt`を実行した後、あなたが同様に` $ OUTOUT_CUR`を実行する必要がありますOracle Documentation

// Define MYDB connection string as described in tnsnames.ora 
define("MYDB","(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = JXYX.com)(PORT = 1521)))(CONNECT_DATA=(SID=DHSJKS)))"); 
// Connect to database 
$conn = oci_connect("XXXXXX","XXXXXXXX",MYDB); 
// Through error if not connected 
if (!$conn) { 
    $e = oci_error(); 
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); 
} 
// Bind the your input and output parameters to PHP variables     
$stmt = oci_parse($conn,'BEGIN SP_GET_MY_DATA(:POP, :SEG, :DUR, :VIEW, :PAGE, :OUTPUT_CUR); END;');      
oci_bind_by_name($stmt,':POP',$pop);   
oci_bind_by_name($stmt,':SEG',$seg);   
oci_bind_by_name($stmt,':DUR',$dur);   
oci_bind_by_name($stmt,':VIEW',$view);   
oci_bind_by_name($stmt,':PAGE',$page); 
// Declare your cursor   
$OUTPUT_CUR = oci_new_cursor($conn); 
oci_bind_by_name($stmt,":OUTPUT_CUR", $OUTPUT_CUR, -1, OCI_B_CURSOR);  
// Execute statement    
oci_execute($stmt); 
// Execute the cursor 
oci_execute($OUTPUT_CUR); 
// Fetch results 
while ($data = oci_fetch_assoc($OUTPUT_CUR)) { 
    print_r($data); 
}