db2_exec

(PECL ibm_db2 >= 1.0.0)

db2_exec Executa uma instrução SQL diretamente

Descrição

db2_exec(resource $connection, string $statement, array $options = []): resource|false

Executa uma instrução SQL diretamente.

Se for planejado interpolar variáveis ​​PHP na instrução SQL, é necessário ter ciência que esta é uma das exposições de segurança mais comuns. Deve ser considerado chamar db2_prepare() para preparar uma instrução SQL com marcadores de parâmetro para valores de entrada. Na sequência pode ser chamada a função db2_execute() para passar os valores de entrada e evitar ataques de injeção de SQL.

Se a intenção for emitir repetidamente a mesma instrução SQL com diferentes parâmetros, podem ser chamadas as funções db2_prepare() e db2_execute() para permitir que o servidor de banco de dados reutilize o plano e aumente a eficiência do acesso ao banco de dados.

Parâmetros

connection

Uma variável de recurso de conexão de banco de dados válida, conforme retornada de db2_connect() ou db2_pconnect().

statement

Uma instrução SQL. A instrução não pode conter nenhum marcador de parâmetro.

options

Um array associativo contendo opções de instrução. Este parâmetro pode ser usado para solicitar um cursor rolável em servidores de banco de dados que suportam esta funcionalidade.

Para uma descrição das opções de instrução válidas, consulte db2_set_option().

Valor Retornado

Retorna um recurso de instrução se a instrução SQL foi emitida com sucesso, ou false se o banco de dados falhou ao executar a instrução SQL.

Exemplos

Exemplo #1 Criando uma tabela com db2_exec()

O exemplo a seguir usa db2_exec() para emitir um conjunto de instruções DDL no processo de criação de uma tabela.

<?php
$conn
= db2_connect($database, $user, $password);

// Cria a tabela de teste
$create = 'CREATE TABLE animals (id INTEGER, breed VARCHAR(32),
name CHAR(16), weight DECIMAL(7,2))'
;
$result = db2_exec($conn, $create);
if (
$result) {
print
"A tabela foi criada com sucesso.\n";
}

// Preenche a tabela de teste
$animals = array(
array(
0, 'cat', 'Pook', 3.2),
array(
1, 'dog', 'Peaches', 12.3),
array(
2, 'horse', 'Smarty', 350.0),
array(
3, 'gold fish', 'Bubbles', 0.1),
array(
4, 'budgerigar', 'Gizmo', 0.2),
array(
5, 'goat', 'Rickety Ride', 9.7),
array(
6, 'llama', 'Sweater', 150)
);

foreach (
$animals as $animal) {
$rc = db2_exec($conn, "INSERT INTO animals (id, breed, name, weight)
VALUES (
{$animal[0]}, '{$animal[1]}', '{$animal[2]}', {$animal[3]})");
if (
$rc) {
print
"Insert... ";
}
}
?>

O exemplo acima produzirá:

A tabela foi criada com sucesso.
Insert... Insert... Insert... Insert... Insert... Insert... Insert...

Exemplo #2 Executando uma instrução SELECT com um cursor rolável

O exemplo a seguir demonstra como solicitar um cursor rolável para uma instrução SQL emitida por db2_exec().

<?php
$conn
= db2_connect($database, $user, $password);
$sql = "SELECT name FROM animals
WHERE weight < 10.0
ORDER BY name"
;
if (
$conn) {
require_once
'prepare.inc';
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while (
$row = db2_fetch_array($stmt)) {
print
"$row[0]\n";
}
}
?>

O exemplo acima produzirá:

Bubbles
Gizmo
Pook
Rickety Ride

Exemplo #3 Retornando dados XML como um SQL ResultSet

O exemplo a seguir demonstra como trabalhar com documentos armazenados em uma coluna XML usando o banco de dados SAMPLE. Usando um pouco de SQL/XML bem simples, este exemplo retorna alguns dos nós em um documento XML em um formato SQL ResultSet com o qual a maioria dos usuários está familiarizada.

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = 'SELECT * FROM XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" VARCHAR (50) PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) AS T
WHERE NAME = \'Kathy Smith\'
'
;
$stmt = db2_exec($conn, $query);

while(
$row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE\n");
}
db2_close($conn);

?>

O exemplo acima produzirá:

1000     Kathy Smith     416-555-1358
1001     Kathy Smith     905-555-7258

Exemplo #4 Executando um "JOIN" com dados XML

O exemplo a seguir funciona com documentos armazenados em 2 colunas XML diferentes no banco de dados SAMPLE. Ele cria 2 tabelas temporárias dos documentos XML de 2 colunas diferentes e retorna um SQL ResultSet com informações sobre o status de envio para o cliente.

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT A.CID, A.NAME, A.PHONE, C.PONUM, C.STATUS
FROM
XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" BIGINT PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) as A,
PURCHASEORDER AS B,
XMLTABLE (
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("PURCHASEORDER.PORDER")/PurchaseOrder\'
COLUMNS
"PONUM" BIGINT PATH \'@PoNum\',
"STATUS" VARCHAR (50) PATH \'@Status\'
) as C
WHERE A.CID = B.CUSTID AND
B.POID = C.PONUM AND
A.NAME = \'Kathy Smith\'
'
;

$stmt = db2_exec($conn, $query);

while(
$row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE $row->PONUM $row->STATUS\n");
}

db2_close($conn);

?>

O exemplo acima produzirá:

1001     Kathy Smith     905-555-7258     5002     Shipped

Exemplo #5 Retornando dados SQL como parte de um documento XML maior

O exemplo a seguir funciona com uma parte dos documentos PRODUCT.DESCRIPTION no banco de dados SAMPLE. Ele cria um documento XML contendo descrição do produto (dados XML) e informações de preço (dados SQL).

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT
XMLSERIALIZE(
XMLQUERY(\'
declare boundary-space strip;
declare default element namespace "http://posample.org";
<promoList> {
for $prod in $doc/product
where $prod/description/price < 10.00
order by $prod/description/price ascending
return(
<promoitem> {
$prod,
<startdate> {$start} </startdate>,
<enddate> {$end} </enddate>,
<promoprice> {$promo} </promoprice>
} </promoitem>
)
} </promoList>
\' passing by ref DESCRIPTION AS "doc",
PROMOSTART as "start",
PROMOEND as "end",
PROMOPRICE as "promo"
RETURNING SEQUENCE)
AS CLOB (32000))
AS NEW_PRODUCT_INFO
FROM PRODUCT
WHERE PID = \'100-100-01\'
'
;

$stmt = db2_exec($conn, $query);

while(
$row = db2_fetch_array($stmt)){
printf("$row[0]\n");
}
db2_close($conn);

?>

O exemplo acima produzirá:

<promoList xmlns="http://posample.org">
    <promoitem>
    <product pid="100-100-01">
        <description>
            <name>Snow Shovel, Basic 22 inch</name>
            <details>Basic Snow Shovel, 22 inches wide, straight handle with D-Grip</details>
            <price>9.99</price>
            <weight>1 kg</weight>
        </description>
    </product>
    <startdate>2004-11-19</startdate>
    <enddate>2004-12-19</enddate>
    <promoprice>7.25</promoprice>
    </promoitem>
</promoList>

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 1 note

up
1
shawn at frozen-o dot com
18 years ago
If you need to "emulate" offset/limit (as PEAR::DB puts it) for db2 queries, you will definitely need to add array('cursor' => DB2_SCROLLABLE) to your db2_exec() call. Otherwise, you will get nothing useful from db2_fetch_{whatever}() when you try to (see following hack for example):

<?php
$limit
= 10;
$offset = 20;

for (
$i = 0; $i < $limit && $row = db2_fetch_array($result, $offset + $i); $i++) {
// stuff goes here
}
?>

You can accomplish the same time of thing using sub-selects, "with" statements and other things new to me in the world of DB2, but the more dynamically generated the queries, the more difficult it gets to implement limit/offset behavior on the fly.
To Top