【问题标题】:How i can call oracle function with out parameter with PHP?如何使用 PHP 调用带有 out 参数的 oracle 函数?
【发布时间】:2016-12-19 23:33:45
【问题描述】:

我正在尝试使用返回 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;

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

【问题讨论】:

    标签: php oracle codeigniter


    【解决方案1】:

    来自php manual

    流程:

    //  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);
    
    ?> 
    

    【讨论】:

    • 谢谢利奥。您的示例是 PROCEDURE,但稍后,当我有时间时,我会尝试使用我的功能并给您反馈。
    • 添加了函数示例
    • 难道不能以浮点数的形式获得返回值吗?我不想处理由字符串表示的数字,但我在处理它时遇到了问题。另一方面,浮点数并不精确,但似乎例如在 Oracle NUMBER 数组参数的情况下,不能传递字符串 - 只有浮点数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2013-10-27
    相关资源
    最近更新 更多