2016-05-05 4 views
0

Yii2でこのコードを実行する正しい方法は何ですか。私はoci_new_cursor() expects parameter 1 to be resource, object givenを得る。DBインスタンスの取得

// get DB instance 
$connection = Yii::$app->db; 
// set cursor 
$refcur = oci_new_cursor($connection); 

$q = "BEGIN :RC := REPORT_CARDS.GET_DATA(:I_YEAR); END;"; 
... 
+0

免責事項:私はOracle DBまたはPHP OCI8に精通していません。私が理解する限り、Yiiは内部的にPDOを使用しますが、PDOはOCI8とうまく対応しません。だから、あなたはYiiによって提供される能力が十分でない何かを実際にしようとしていますか? '\ Yii :: $ app-> db-> createCommand($ q) - > execute();のようなものがあなたのために働くでしょうか? – Thernys

+0

@ Thernys私はそれがそうなるとは思わない。 createCommandはSQL文を要求します。私はDBインスタンス上の引数を取る、新しいociカーソルを作成しようとしています – Jonnny

+0

私はあなたが[XY問題](http://meta.stackexchange.com/questions/)の被害者ではないことを主に確認しようとしていました。 66377/what-is-the-xy-problem)があります。 YiiはPDOを使用します。 '\ Yii :: $ app-> db-> pdo'からPDOインスタンスを取得できますが、PDOオブジェクトの基礎となる接続リソースにアクセスできるかどうかは疑問です。 XY問題の部分は、直接的なリソースが本当に必要であり、OCI8を使用するか、PDOインターフェースを使って同じ最終目標を達成できるかどうかです。最後のオプションは当然、生のPHPでYiiの外で作業するか、 'yii \ db \ Connection'から始まるものを上書きすることです。 – Thernys

答えて

1

心に留めておくべきいくつかの重要な事実があります。

  1. Yii uses PDO
  2. PDOとOCI8は、Oracleデータベース(PDO_OCI)のためのPDOドライバ
  3. completely different extensionsであり、あなたは、それらの使用を混在させることはできません制限があります。例えばそれはcursors aren't really supportedと思われ、その使用は一般的なnot really recommended
    • であるPDO

することはでき、\Yii::$app->db->pdoでのYiiが使用するPDOインスタンスを取得しますが、などとも試みカーソル使用のthis exampleを見ます上記のポイント2ごとに、これはあなたの例で使用しようとしているOCI8関数では役に立ちません。ポイント3のとおり、OCI8を置き換えるだけでPDOを使用する方法を学ぶことにリソースを投入することは、素晴らしい考えではありません。

まだ解決できない問題についてもう一度「Yii way」を与えたい場合は、yii\db\Commandでどのくらい手を伸ばしてみるか試してみてください。あなたのコメントで参照してoci_bind_by_name()のPDOの対応部分はPDOStatement::bindParamです。これは基本的にyii\db\Command::bindParamでプロキシされています。だから、特注のSQLクエリのための非常に基本的な使用例は、私は本当にあなたの具体的な例を用いてテストすることはできません、と私は読んだことをもとに、私は成功を保証することはできません

// $var1 and $var2 somewhere 
$command = \Yii::$app->db->createCommand('some query with :bound :values'); 
$command->bindParam(':bound', $var1, \PDO::PARAM_STR); 
$command->bindParam(':values', $var2, \PDO::PARAM_STR || \PDO::PARAM_INPUT_OUTPUT); 
$command->execute(); 

ようなものになるだろうあなた自身のためにしようとするが、私はあなたが探検で幸運を望む。それが成功に足りない場合、私はそれの周りに簡単な方法は見当たらない。自分で別の接続を使用して、oci_connectなどで手動で初期化してから、OCI8で通常どおり動作させるだけです。

+0

おかげで、私はOCI8が進歩しており、それを手作業で行うと思います。 – Jonnny

関連する問題