【问题标题】:stored procedure with OUT variable not working with oracle & symfony2带有 OUT 变量的存储过程不适用于 oracle 和 symfony2
【发布时间】:2016-10-22 19:12:08
【问题描述】:

我需要什么

  • 我需要从存储过程中获取json数据

  • 我有很多谷歌但无法解决问题

源代码

               $param1 = 'abc';

                $param2 = '79';

                $param3 = 'Y';

                $param4 = 121221;


                $sql1='CALL web_demo.wwv_json_data.dashboard(:param1, :param2 , :param3, :param4,@p_json)';
                $qb = $em->getConnection()->prepare($sql1);
                $qb->bindParam('param1', $param1, \PDO::PARAM_INPUT_OUTPUT, 4000);

                $qb->bindParam('param2', $param2, \PDO::PARAM_INPUT_OUTPUT, 4000);

                $qb->bindParam('param3', $param3, \PDO::PARAM_INPUT_OUTPUT, 1);

                $qb->bindParam('param4', $param4, \PDO::PARAM_INPUT_OUTPUT, 4000);

                $st=$qb->execute();
                $st->closeCursor();
                $stmt = $qb->query("SELECT @p_json as json");
                $result = $qb->fetchAll(PDO::FETCH_ASSOC);

程序

     PROCEDURE dashboard
       (p_customer_id IN VARCHAR2 DEFAULT NULL, p_user_id IN VARCHAR2 DEFAULT NULL, p_staff IN VARCHAR2 DEFAULT NULL,p_random IN VARCHAR2 DEFAULT NULL,out p_json clob) 

    END dashboard

oracle sql 开发者代码

     DECLARE
    v clob;
     BEGIN 
   web_demo.wwv_json_data.dashboard('abc','79','Y',121221,v);
   dbms_output.put_line(v);
     END; 

返回 json

   {"data":[{"open_log":46,"to_m":34,"to_clien":12,"to_m":0}]}

错误

   An exception occurred while executing 'CALL    web_demo.wwv_json_data.dashboard(:param1, :param2 , :param3, :param4,@p_json)':

   SQLSTATE[HY000]: General error: 936 OCIStmtExecute: ORA-00936: missing expression
(ext\pdo_oci\oci_statement.c:148)
  • 我用谷歌搜索发现 OUT 可以访问光标数据。

我需要什么

  • 我需要从存储过程中获取json数据。
  • 我正在访问这样的变量

                $stmt = $qb->query("SELECT @p_json as json");
                $result = $qb->fetchAll(PDO::FETCH_ASSOC); 
    
  • 谁能帮助我如何通过在 oracle 和 symfony2 中使用 out 变量来获取数据。

【问题讨论】:

    标签: php json oracle symfony doctrine


    【解决方案1】:

    经过长期的努力,我终于找到了解决办法

    代码sn-p

                                        <?php
                                        $userName = ""; $password = ""; $dtabasePort = "1521"; $serverName = "someip";
    
    
                                        $c = oci_connect($userName, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME =dbname) (SID =dbname)))');
    
                                        $sql = 'BEGIN web_demo.wwv_json_data.dashboard(:param1, :param2 , :param3, :param4,:param5); END;';
    
                                        $stmt = oci_parse($c,$sql);
    
    
                                        $id;
                                        oci_bind_by_name($stmt,":param1",$param1,32);
                                        oci_bind_by_name($stmt,":param2",$param2,500);
                                        oci_bind_by_name($stmt,":param3",$param3,32);
                                        oci_bind_by_name($stmt,":param4",$param4,200);
                                        oci_bind_by_name($stmt,":param5",$id,200);
                                        // Explained in the next example... (use an empty value for now)
                                        //$param5 = oci_new_collection($c,'LIST_OF_NUMBERS');
                                        //oci_bind_by_name($stmt,':param5',$param5,32,OCI_B_SQLT_NTY);
    
                                        // Create a new lob descriptor object
    
    
                                        // Execute the statement but do not commit
                                        oci_execute($stmt, OCI_DEFAULT);
    
                                        print_r($id);
    
                                        // Everything OK so commit
                                        oci_commit($c);
    
    
                                        if (!$c) {
                                        $m = oci_error();
                                        echo $m['message'], "\n";
                                        exit;
                                        }
                                        else {
                                        print "Connected to Oracle!";
                                        }
                                        print_r($c);
                                        ?>
    

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      相关资源
      最近更新 更多