【问题标题】:How to call oracle stored procedure in Codeigniter如何在 Codeigniter 中调用 oracle 存储过程
【发布时间】:2015-03-13 13:40:59
【问题描述】:

我是 CI 应用程序和 oracle 数据库的新手。我想从活动记录中执行一个存储过程。但我找不到任何可靠的文档。

有人有使用 CodeIgniter 和/或 Active Record 调用存储过程并传入参数的经验吗?

function write_message($type = "debug", $message = "", $description = "")
{
    $_fw =& get_instance();

    $data['LOG_TYPE'] = 4;

    switch ($type)
    {
        case "error":
            $data['LOG_TYPE'] = 1;
            break;

        case "success":
            $data['LOG_TYPE'] = 2;
            break;

        case "message":
            $data['LOG_TYPE'] = 3;
            break;

        case "debug":
            $data['LOG_TYPE'] = 4;
            break;

        default:
            $data['LOG_TYPE'] = 1;
            break;
    }

    $data['LOG_URI_STRING'] = uri_string();

    $data['LOG_MESSAGE'] = $message;

    $data['LOG_DESCRIPTION'] = $description;

    $data['LOG_USER_AGENT'] = $_fw->input->user_agent();

    $data['LOG_USER_ID'] = $_fw->session->userdata('USER_ID') != null?$_fw->session->userdata('USER_ID'):0;

    $data['LOG_ADDEN_ON'] = mktime();

    $data['OPERATION_IP'] = $_fw->input->ip_address();

    $sql = $_fw->db->query("CALL dpe_acl.pkg_SYSTEM_LOGS.addSystemLogs('', '".$data['LOG_TYPE']."', '".$data['LOG_URI_STRING']."', '".$data['LOG_MESSAGE']."', '".$data['LOG_DESCRIPTION']."', '".$data['LOG_USER_AGENT']."', '".$data['LOG_USER_ID']."', '".$data['LOG_ADDEN_ON']."', '".$data['OPERATION_IP']."')");

    return;
}

这样做我会收到这样的警告

Severity: Warning

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

Filename: oci8/oci8_result.php

Line Number: 83

请帮忙...提前谢谢...

【问题讨论】:

    标签: php oracle codeigniter stored-procedures procedure


    【解决方案1】:

    出现此错误是因为在调用存储过程之前没有正确绑定入/出参数。现在我对CI没有太多经验所以我不知道它是如何执行查询字符串的,但我知道你必须先将输入和输出参数绑定到局部变量,你不能只是将它们放入查询字符串。

    这是一个示例链接,可以帮助您解决这个问题。 http://www.dbmotive.com/ora-24374-define-not-done-before-fetch-or-execute-and-fetch/

    【讨论】:

      【解决方案2】:

      对于存储过程使用$this->db->stored_procedure('package or schema','you_store_procedure',$parameters)。 $parameters 是这样的:

      $parametros=array( 
         array('name'=>':param','value'=>'pass_variable or value','length'=>-1,'type'=>SQLT_CHR),
         array('name'=>':param','value'=>'pass_variable or value','length'=>-1,'type'=>SQLT_CHR), ....
      );
      

      对于 OUT 参数,在变量前面加上 & 并设置长度值,例如 array('name'=>':param','value'=>&$param,'length'=>30,'type'=>SQLT_CHR)

      【讨论】:

        【解决方案3】:

        在你的模型中试试这个:

        if (!$this->db) {
          $m = oci_error();
          trigger_error(htmlentities($m['message']), E_USER_ERROR);
        }
        
        $stid = oci_parse($this->db->conn_id, 'BEGIN PROCEDURE_NAME(:PARAMETER_1,:PARAMETER_2,:OUT_MESSAGE); end;');
        
        oci_bind_by_name($stid, ':PARAMAETER_1',  $PARAMAETER_1,200);
        oci_bind_by_name($stid, ':PARAMETER_2',  $PARAMETER_2,200);
        oci_bind_by_name($stid, ':OUT_MESSAGE',  $OUT_MESSAGE ,100, SQLT_CHR);
        
        if(oci_execute($stid)){
          $results = $OUT_MESSAGE;
        }
        oci_free_statement($stid);
        oci_close($this->db->conn_id);
        
        return  $results;
        

        【讨论】:

          猜你喜欢
          • 2013-08-14
          • 2011-12-07
          • 2022-01-18
          • 2010-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多