si
Administrator
Overloading в PL/SQL и типы в РНР
результат
string(7) "varchar"
string(7) "varchar"
string(7) "integer"
получается что все переменые из РНР биндятся как string
PHP:
<?
$conn = oci_connect(DB_USER, DB_PASS, DB_BASE);
if (!conn)
die("Can not connect");
$orasql = <<<EOT
CREATE OR REPLACE PACKAGE T AS
FUNCTION test1(param1 IN INTEGER) RETURN VARCHAR2;
FUNCTION test1(param1 IN VARCHAR2) RETURN VARCHAR2;
END T;
EOT;
if (!$stmt = oci_parse($conn, $orasql))
die("Error:".__LINE__);
if ( !oci_execute($stmt,OCI_DEFAULT) )
die("Error:".__LINE__);
$orasql = <<<EOT
CREATE OR REPLACE PACKAGE BODY T AS
FUNCTION test1(param1 IN INTEGER) RETURN VARCHAR2
IS
tmp varchar(30) := 'integer';
BEGIN
dbms_output.put_line(tmp);
RETURN tmp;
END;
FUNCTION test1(param1 IN VARCHAR2) RETURN VARCHAR2
IS
tmp varchar(30) := 'varchar';
BEGIN
dbms_output.put_line(tmp);
RETURN tmp;
END;
END T;
EOT;
if (!$stmt = oci_parse($conn, $orasql))
die("Error:".__LINE__);
if ( !oci_execute($stmt,OCI_DEFAULT) )
die("Error:".__LINE__);
$orasql = <<<EOT
DECLARE
r1 varchar(100);
r2 varchar(100);
r3 varchar(100);
BEGIN
r1:=t.test1(:inval1);
r2:=t.test1(:inval2);
r3:=t.test1(TO_NUMBER(:inval1));
:retval1:=r1;
:retval2:=r2;
:retval3:=r3;
END;
EOT;
if (!$stmt = oci_parse($conn, $orasql))
die("Error:".__LINE__);
$int = 1;
$str = '1';
oci_bind_by_name($stmt, ':retval1', $retval1, 30);
oci_bind_by_name($stmt, ':retval2', $retval2, 30);
oci_bind_by_name($stmt, ':retval3', $retval3, 30);
oci_bind_by_name($stmt, ':inval1', $int, 30);
oci_bind_by_name($stmt, ':inval2', $str, 30);
if ( !oci_execute($stmt,OCI_DEFAULT) )
die("Error:".__LINE__);
else
{
var_dump($retval1);
var_dump($retval2);
var_dump($retval3);
}
?>
string(7) "varchar"
string(7) "varchar"
string(7) "integer"
получается что все переменые из РНР биндятся как string