downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

oci_password_change> <oci_num_rows
Last updated: Fri, 06 Nov 2009

view this page in

oci_parse

(PHP 5, PECL oci8 >= 1.1.0)

oci_parsePrepares Oracle statement for execution

Descrierea

resource oci_parse ( resource $connection , string $query )

Prepares the query using connection and returns the statement identifier, which can be used with oci_bind_by_name(), oci_execute() and other functions.

Parametri

connection

An Oracle connection identifier, returned by oci_connect() or oci_pconnect().

query

The SQL query.

Valorile întroarse

Returns a statement handler on success, or FALSE on error.

Note

Notă: This function does not validate query . The only way to find out if query is valid SQL or PL/SQL statement - is to execute it.

Notă: In PHP versions before 5.0.0 you must use ociparse() instead. This name still can be used, it was left as alias of oci_parse() for downwards compatability. This, however, is deprecated and not recommended.



oci_password_change> <oci_num_rows
Last updated: Fri, 06 Nov 2009
 
add a note add a note User Contributed Notes
oci_parse
michael dot virnstein at brodos dot de
04-Dec-2007 04:43
A neat way to parse a query only once per script, if the query is done inside a function:

<?php
function querySomething($conn, $id)
{
    static
$stmt;

    if (
is_null($stmt)) {
       
$stmt = oci_parse($conn, 'select * from t where pk = :id');
    }

   
oci_bind_by_name($stmt, ':id', $id, -1);

   
oci_execute($stmt, OCI_DEFAULT);

    return
oci_fetch_array($stmt, OCI_ASSOC);

}

?>

With the static variable, the statment handle isn't closed after the function has terminated. Very nice for functions that are called e.g. in loops. Unfortunately this only works for static sql. If you have dynamic sql, you can do the following:

<?php

function querySomething($conn, $data)
{
    static
$stmt = array();
   
   
$first = true;
   
   
$query = 'select * from t';

    foreach (
$data as $key => $value) {
        if (
$first) {
           
$first = false;
           
$query .= ' where ';
        } else {
           
$query .= ' and ';
        }
       
       
$query .= "$key = :b$key";
    }
   
   
$queryhash = md5($query);
  
    if (
is_null($stmt[$queryhash])) {
       
$stmt[$queryhash] = oci_parse($conn, $query);   
    }

    foreach (
$data as $key => $value) {
       
// don't use $value, because we bind memory addresses here.
        // this would result in every bind pointing at the same value after foreach
       
oci_bind_by_name($stmt[$queryhash], ":b$key", $data[$key], -1);
    }
   
   
oci_execute($stmt[$queryhash], OCI_DEFAULT);

    return
oci_fetch_array($stmt[$queryhash], OCI_ASSOC);

}

?>
badr at arabiadata dot com
18-Jul-2006 12:17
connecting to oracle database, get the data and insert it into a dynamic drop down box

<?php

  $conn
= oci_connect("$username", "$password", 'ora10g');
  if (!
$conn) {
  
$e = oci_error();
   print
htmlentities($e['message']);
   exit;
  }

 
?>

<SELECT name="name">
                   
                    <?php
$query2
= "SELECT EMP_NAME, EMP_CODE FROM HR_EMP where APP_USER='$suserid' ";
$statement2 = oci_parse ($conn, $query2);
oci_execute ($statement2);
while (
$row = oci_fetch_array ($statement2, OCI_NUM)) {
  
?>
                  <option value="<?  echo $row[1]; ?>"> <? echo $row[0] ?> </option>
                    <? }
?>
                </select>
27-Jan-2006 12:05
one of the most things that is done wrong with oracle is the following.

Cosider:

<?php
$dbh
= ocilogon('user', 'pass', 'db');

for (
$i = 0; $i<=10; $i++) {
   
$sth = ociparse($dbh, 'SELECT * FROM T WHERE x = :x');

   
ocibindbyname($sth, ':x', $i, -1);
   
ociexecute($sth, OCI_DEFAULT);
    if (
ocifetchrow($sth, $row, OCI_ASSOC+OCI_RETURN_NULLS)) {
       
var_dump($row);
    }
}

ocilogoff($dbh);
?>

Problem here is, that you parse the same statement over and over and that'll cost ressources and will introduce many wait events. This problem will increase exponentially with the number of users using your system. That's one of the things besides not using bind variables that will prevent your application from scaling well.

The right approach:

<?php
$dbh
= ocilogon('user', 'pass', 'db');
$sth = ociparse($dbh, 'SELECT * FROM T WHERE x = :x');
for (
$i = 0; $i<=10; $i++) {
   
ocibindbyname($sth, ':x', $i, -1);
   
ociexecute($sth, OCI_DEFAULT);
    if (
ocifetchrow($sth, $row, OCI_ASSOC+OCI_RETURN_NULLS)) {
       
var_dump($row);
    }
}
ocilogoff($dbh);
?>

Now we are parsing the statement once and using it as often as possible.

When your using Oracle, create proper indexes, use bind variables and parse once and execute often. Not doing so will get you into trouble when more than a few users are working with your application simultaneously.
kurt at kovac dot ch
04-May-2004 03:40
For those that are having trouble with error checking, i have noticed on a lot of sites that people are trying to check the statement handle for error messages with OCIParse. Since the statement handle ($sth) is not created yet, you need to check the database handle ($dbh) for any errors with OCIParse. For example:

instead of:

<?php
$stmt
= OCIParse($conn, $query);
if (!
$stmt) {
  
$oerr = OCIError($stmt);
   echo
"Fetch Code 1:".$oerr["message"];
   exit;
}
?>

use:

<?php
$stmt
= OCIParse($conn, $query);
if (!
$stmt) {
  
$oerr = OCIError($conn);
   echo
"Fetch Code 1:".$oerr["message"];
   exit;
}
?>

Hope this helps someone.
steveg at instantdx dot com
02-May-2003 12:53
OCIParse() does return errors, try having a mismatched single quote on an insert, in this case OCIParse returned FALSE, and a call to OCIError($connection) returned the message:  ORA-01756: quoted string not properly terminated

It does seems that OCIParse doesn't catch a whole lot of stuff tho.
chris_maden at hotmail dot com
24-Feb-2001 08:18
It took me a while to work out the semantics of error handling for the Parse/Fetch/Execute seqeunce as well.

OCIParse always returns true, so testing it is a waste of time. Instead, call OCIError, and test the value of the "code" element.

OCINumRows always returns 1, BTW, so you have to loop. There are a number of other postings on this.

<?php

putenv
("ORACLE_SID=admin");
putenv("ORACLE_HOME=/home/oracle");

// Kill the internal messages: this is DIY

error_reporting(0);

$conn = OCILogon("scott", "tiger");
$oerr = OCIError();

if (
$oerr) {
    if (
$oerr["code"] == "1017")
        echo
"Please check your username and password";
    else
        echo
"Error ".$oerr["message"];
    exit;
} else {
    echo
"Hello";
}

// The table name here should be "emp", not "empxx"

$query = sprintf("select * from empxx");

/* Long version */
 
// Testing the result of the OCIParse call directly doesn't work...

$stmt = OCIParse($conn, $query);
if (!
$stmt) {
   
$oerr = OCIError($stmt);
    echo
"Fetch Code 1:".$oerr["message"];
    exit;
}

// However, if you test this, it performs as you would hope

$oerr = OCIError($stmt);
echo
"Fetch Code 2:".$oerr["code"];
if (
$oerr["code"]) {
    echo
"Error:".$oerr["message"];
    exit;
}

// Or, you can catch it here (comment out the above block of code)

if (!OCIExecute($stmt)) {
   
$oerr = OCIError($stmt);
    echo
"Execute Code:".$oerr["code"];
    if (
$oerr["code"]) {
        echo
"Error:".$oerr["message"];
        exit;
    }
}
OCIFetch($stmt);
 
$ncols = OCINumCols($stmt);
$nrows = OCIRowCount($stmt);
printf("Result size is $ncols cols by $nrows rows.<br>");

for (
$i=1; $i<=$ncols; $i++) {
   
printf("col[%s] = %s type[%d] = %s size[%d] = %s<br>",
       
$i, OCIColumnName($stmt, $i),
       
$i, OCIColumnType($stmt, $i),
       
$i, OCIColumnSize($stmt, $i));
}

$j=1;

do {
    for (
$i=1; $i<=$ncols; $i++) {
       
$col = OCIResult($stmt, $i);
       
printf("val[%d, %d] = %s * ", $j, $i, $col); 
    } 
   
printf("<br>"); 
   
$j++;
} while (
OCIFetch($stmt));
?>
mwd at modulo3 dot de
22-Dec-2000 03:21
if you're using "complex" statements e.g such having calls to build in oracle functions in the select list (as in example below), I did not find any other way as using the "AS <Name>" clause to being able to output the functions outcome using ociresult

example:

<?php
ociparse
($conn,"select EMPNO, LPAD(' ', 2*(LEVEL-1)) || ENAME AS COMPLETE_FANTASY_NAME, JOB, HIREDATE from scott.emp start with job='MANAGER' connect by PRIOR EMPNO = MGR");

echo
ociresult $stmt,"COMPLETE_FANTASY_NAME")." ";
?>

BTW: I also found out by TAE that "COMPLETE_FANATASY_NAME" might not be "complete fantasy" as it has to be all capital letters.
webmaster at remoterealty dot com
01-Nov-1999 09:47
This calls stored procedure sp_newaddress, with :address_id being an in/out variable and :error_code being an out variable.

<?php
   $sth
= OCIParse ( $dbh, "begin sp_newaddress( :address_id, '$firstname', '$lastname', '$company', '$address1', '$address2', '$city', '$state', '$postalcode', '$country', :error_code );end;" );
?>

Then you do the binding:

<?php
   OCIBindByName
( $sth, ":address_id", $addr_id, 10 );
  
OCIBindByName ( $sth, ":error_code", $errorcode, 10 );
  
OCIExecute ( $sth );
?>

Hope this helps!

oci_password_change> <oci_num_rows
Last updated: Fri, 06 Nov 2009
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites