Jump to content
lsantgo

SELECT ... FOR UPDATE com PHP

Recommended Posts

Estou a dois dias tentando resolver esse problema, se alguém puder me ajudar eu agradeço de mais. Possuo a seguinte consulta:

SELECT proxNum FROM orcamento FOR UPDATE;

UPDATE orcamento SET proxnum = proxnum + 1;

Ela serve para que eu possa captar o próximo numero disponível para orçamento e já fazer um update adicionando 1 unidade a esse numero antes que que a aplicação quando usada por outro usuário capte o mesmo numero que outro.

A consulta funciona perfeitamente, o banco usado é oracle 11g.

Porém não consigo aplicar isso na linguagem php, pois a query não aceita 2 consultas. Já tentei usar cursores utilizando de oci_new_cursor, porém sem exito. Alguns trechos de código tentei adaptar de exemplos desse site PHP oci_new_cursor Examples Se alguém puder me ajudar por favor. Já nem sei mais o que tentar

Seguem abaixo 2 exemplos de códigos (um com cursor e outro sem) :

 

<?php
include "config.php"; //arquivo de configuração
//------------------------------------------------------------------------------------------------------//

$query2 = "BEGIN
SELECT proxnum FROM orcamento FOR UPDATE of proxnum;
UPDATE orcamento SET proxnum = proxnum + 1; 
end;";

$s2 = oci_parse($c, $query2);
if (!$s2) {
    $m2 = oci_error($c);
    trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR);
} //prepara para a execução

$refcur = oci_new_cursor($c); 

$r2 = oci_execute($s2);
if (!$r2){
    $m2 = oci_error($s2);
    trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR);
}// executa a consulta
 oci_execute($refcur);
?>
<?php
include "config.php"; //arquivo de configuração
//------------------------------------------------------------------------------------------------------//

$query2 = "
SELECT proxnum FROM orcamento FOR UPDATE of proxnum;
UPDATE orcamento SET proxnum = proxnum + 1; ";

$s2 = oci_parse($c, $query2);
if (!$s2) {
    $m2 = oci_error($c);
    trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR);
} //prepara para a execução


$r2 = oci_execute($s2);
if (!$r2){
    $m2 = oci_error($s2);
    trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR);
}// executa a consulta

?>

 

Share this post


Link to post
Share on other sites

Consegui resolver da seguinte maneira

 

$query2 = "DECLARE
CURSOR cursore IS
SELECT proxnumorc FROM pcconsum FOR UPDATE of proxnumorc;
BEGIN
  OPEN cursore;
UPDATE pcconsum SET proxnumorc = proxnumorc + 1;
COMMIT;
  CLOSE cursore;
END;";

 

Fiz um cursor com um bloco PL/SQL e deu certo.
Porém,  preciso armazenar o resultado do select que esta dentro do cursor em uma variável php, e depois imprimir a variável.

Entretanto, quando tento, me deparo com o seguinte erro:
Warning: oci_fetch_array(): ORA-24374: define not done before fetch or execute and fetch in C:\xampp\htdocs\ProjectO\numorca.php on line 31


O retorno do cursor não é aceito. Alguem sabe como resolver isso?

Share this post


Link to post
Share on other sites

Adicione seu código aqui.

Share this post


Link to post
Share on other sites
<?php
include "config.php"; //arquivo de configuração
//------------------------------------------------------------------------------------------------------//

$query2 = "DECLARE
v_consulta NUMBER;
CURSOR cursore IS
SELECT exemplo FROM tabela FOR UPDATE of exemplo;
BEGIN
  OPEN cursore;
  FETCH cursore INTO v_consulta;
 
  UPDATE tabela SET exemplo = exemplo + 1;
  COMMIT;
  CLOSE cursore;
END;";

$s2 = oci_parse($c, $query2);
if (!$s2) {
    $m2 = oci_error($c);
    trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR);
} 

$r2 = oci_execute($s2);
if (!$r2){
    $m2 = oci_error($s2);
    trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR);
}

$row = oci_fetch_array($s2, OCI_ASSOC + OCI_RETURN_NULLS);
$final = $row['v_consulta'];

echo $final;

?>

Esse é meu código, eu gostaria de buscar o valor retornado pelo select que esta dentro do cursor, para armazenar em uma variável php.

Share this post


Link to post
Share on other sites

No seu caso, não é uma simples query, e sim a execução de um cursor:

 

Depois de oci_parse e antes de oci_execute, é necessário criar o cursor:

$cursor = oci_new_cursor($c)

Além disso, depois de executar o statement ($r2 = oci_execute($s2);), execute o cursor:

oci_execute($cursor);

E itere sobre o cursor:

while ($data = oci_fetch_assoc($cursor, OCI_ASSOC + OCI_RETURN_NULLS)) {
    print_r($data);
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By SECONDSS
      boa noite, preciso entregar algumas questões até daqui a pouco,meu tempo está corrido e gostaria da ajuda de vocês para resolver essa questão. obrigado desde já!

      QUESTÃO 16 -

      Desenvolva um programa utilizando PHP e exibir os resultados desse programa que tenha todas as classes suficientes para que:
      Represente o nome completo de uma pessoa, composto de três strings (nome próprio, nome do meio e nome da família). 
      ATENÇÃO - 
      Escreva nessa classe o método rubrica que retorna somente as iniciais do nome completo em caracteres minúsculos, Escreva nessa classe o método assinatura que retorna as iniciais dos nomes próprio e do meio (com pontos) Escreva nessa classe um método que retorne o nome de família completo. Por exemplo, se o nome da pessoa representado por essa classe for “Jack Mill Dam”, o método rubrica deve retornar ”jmd” e o método assinatura deve retornar ”J.M. Dam”. Para facilitar, considere armazenar os três nomes em strings separadas.
    • By duarte.php
      Boa noite, pessoal, estou fazendo meu tcc (nível técnico kkk) e preciso de ajuda com uma conexão com o banco.
       
      Fiz um formulário para consultar empréstimos em uma biblioteca através do rm (id) e exibir os dados que estão cadastrados neste rm. 
      Estou com dificuldades para que os dados sejam puxados e exibidos na página. 
       
      Esta é a parte que pede o RM no html
      <h4 class="title">Insira o seu RM: </h4> <input type="text" name="rm" class="form-control" required/>  
      Este é o código php
      <?php $rm = $_POST['rm']; include("conecta.php"); $busca = mysql_query("SELECT * FROM tb_locador WHERE rm='$rm'"); $dado = mysql_fetch_array($busca); $nome = $dado['nome']; $ano = $dado['ano']; $curso = $dado['curso']; $tel = $dado['tel']; echo "RM: " . $rm . "<br>"; echo "Nome do locador: ".$nome. "<br>"; echo "Curso do locador: ".$curso. "<br>"; echo "Ano de início do curso: ".$ano. "<br>"; echo "Telefone do locador: ".$tel. "<br>"; ?> Até então, o único dado exibido é o RM, como faço para exibir o nome, curso, ano e telefone? 
       
    • By guzulino
      Então... eu preciso inserir uma paulada de dados em um banco de dados de vez em quando, eu até consigo importar de um CSV pro banco, mas eu preciso fazer isso através do php e eu não tenho nem ideia de como fazer isso, procurei por aqui e não achei, se alguém tem alguma resposta ou referência, manda o link que eu vou dar uma olhada. Valeu.
    • By Guss
      Agradeço quem puder me ajudar a responder essa questão de PHP <3.
      Desenvolva um programa utilizando PHP e  exibir os resultados desse programa que tenha todas as classes suficientes para que:
       
      Represente o nome completo de uma pessoa, composto de três strings (nome próprio, nome do meio e nome da família). 
       
      Escreva nessa classe o método rubrica que retorna somente as iniciais do nome completo em caracteres minúsculos,  Escreva nessa classe o método assinatura que retorna as iniciais dos nomes próprio e do meio (com pontos)  Escreva nessa classe um método que retorne o nome de família completo.  Por exemplo, se o nome da pessoa representado por essa classe for “Marijuana Pepsi Jackson”, o método rubrica deve retornar ”mpj” e o método assinatura deve retornar ”M.P.Jackson”. Para facilitar, considere armazenar os três nomes em strings separadas.
    • By Guss
      Boa noite galera, to com um trabalho para entregar daqui a pouco e gostaria da ajuda de vocês a me ajudar a resolver essa questão:
      Desenvolva um programa utilizando PHP para exibir os resultados desse programa que tenha todas as classes suficientes para que:
       
      Exista uma classe DiferencaData, que possui um método chamado calculaDias, que recebe como parâmetro duas datas e calcula a diferença em dias entre essas datas. Considere que sempre a primeira data fornecida é maior do que a segunda. Considere para efeitos de simplificação que todo mês tem 30 dias e um ano com 365 dias
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.