我是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
请帮助...提前致谢...
答案 0 :(得分:0)
发生此错误是因为在调用存储过程之前未正确绑定输入/输出参数。现在我对CI没有很多经验,所以我不知道它是如何执行查询字符串的,但我知道你必须首先将输入和输出参数绑定到局部变量,你不能这样做只需将它们放在查询字符串中即可。
这是一个示例的链接,可以帮助您解决这个问题。 http://www.dbmotive.com/ora-24374-define-not-done-before-fetch-or-execute-and-fetch/
答案 1 :(得分:0)
对于商店程序使用$this->db->stored_procedure('package or schema','you_store_procedure',$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)
答案 2 :(得分:0)
在你的模特中试试这个:
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;