我如何使用PHP参数调用oracle函数?

时间:2016-12-19 23:33:46

标签: php oracle codeigniter

我正在尝试使用返回true或false的函数对用户进行身份验证。该功能还通过“OUT”参数返回验证用户的名称(如果凭据是正确的);

我正在使用php 5.5,codeigniter框架和oracle的oci8扩展。

我的职责是:

CREATE OR REPLACE FUNCTION AUTENTICAR_UTILIZADOR(USER__USERS.USERNAME%TYPE,PASS_ USERS.PASS%TYPE,NAME OUT USERS.NAME%TYPE )
RETURN BOOLEAN
AS
BEGIN
  SELECT USERNAME INTO NAME FROM USERS WHERE USERNAME=USER_ AND PASS=PASS_;
  RETURN TRUE;
  EXCEPTION
    WHEN NO_DATA_FOUND  THEN
    RETURN FALSE;
  WHEN OTHERS THEN
    RETURN FALSE;
END;

我的问题是我如何调用该函数,检索返回的值和out参数?

1 个答案:

答案 0 :(得分:0)

来自MetadataTransfer

程序:     

//  Before running the PHP program, create a stored procedure in
//  SQL*Plus or SQL Developer:
//
//  CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS
//  BEGIN
//      p2 := p1 * 2;
//  END;

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$p1 = 8;

$stid = oci_parse($conn, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);

// The second procedure parameter is an OUT bind. The default type
// will be a string type so binding a length 40 means that at most 40
// digits will be returned.
oci_bind_by_name($stid, ':p2', $p2, 40);

oci_execute($stid);

print "$p2\n";   // prints 16

oci_free_statement($stid);
oci_close($conn);

?> 

功能:

<?php

//  Before running the PHP program, create a stored function in
//  SQL*Plus or SQL Developer:
//
//  CREATE OR REPLACE FUNCTION myfunc(p IN NUMBER) RETURN NUMBER AS
//  BEGIN
//      RETURN p * 3;
//  END;

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$p = 8;

$stid = oci_parse($conn, 'begin :r := myfunc(:p); end;');
oci_bind_by_name($stid, ':p', $p);

// The return value is an OUT bind. The default type will be a string
// type so binding a length 40 means that at most 40 digits will be
// returned.
oci_bind_by_name($stid, ':r', $r, 40);

oci_execute($stid);

print "$r\n";   // prints 24

oci_free_statement($stid);
oci_close($conn);

?>