Jump to content
Mario Segalla Moreira

Trigger não esta funcionando

Recommended Posts

Boa tarde! eu sou meio novo em BD oracle e estou com um problema. na seguinte trigger/function


 

CREATE OR REPLACE FUNCTION CARRINHO_SALDO
  (CAR IN Number Default Null)
  RETURN Number
 IS 
  SALD Number; 
             
BEGIN 
  Select SALDO into SALD from CARRINHO_COMPRA
  Where CONTA = CAR;
  
  return SALD;
END CARRINHO_SALDO;
create or replace TRIGGER EFETUAR_COMPRA_TRIGGER
  AFTER 
  INSERT OR UPDATE  
  ON EFETUAR_CARRINHO_COMPRA 
  FOR EACH ROW 
  Declare 
  SALD Number;
  BEGIN
  
  SALD:=CARRINHO_SALDO(:new.CONTA);
  
  If :new.COMPRA = 'c' then
   SALD := SALD - :new.VALOR;
   else
   SALD := SALD + :new.VALOR;
  End If;
  
  UPDATE CARRINHO_COMPRA SET SALDO = SALD
    WHERE CONTA = :new.CONTA;
  END;

Essa trigger pegar o campo "compra" do insert  na tabela "EFETUAR_CARRINHO_COMPRA" e salvar na tabela "CARRINHO_COMPRA".

INSERT INTO EFETUAR_CARRINHO_COMPRA(conta,id_Compra,compra,valor,data) VALUES(2,616,'c',1000,'30-06-2017');

segue as tabelas

CREATE TABLE CARRINHO_COMPRA
(
CONTA NUMBER(3) NOT NULL,
SALDO NUMBER(10),
CONSTRAINT CARRINHO_COMPRA_PK PRIMARY KEY(CONTA)
);


CREATE TABLE EFETUAR_CARRINHO_COMPRA
(
CONTA NUMBER(3)NOT NULL,
ID_COMPRA NUMBER(10) NOT NULL,
COMPRA NUMBER(3) NOT NULL,
VALOR NUMBER(10) NOT NULL,
DATA DATE,
CONSTRAINT EFETUAR_PK PRIMARY KEY(ID_COMPRA)
);

Meu problema é.Quando eu dou o insert ele da o update na tabela "efetuar_carrinho_compra"mas não da update na tabela "carrinho_compra"

segue o txt se alguém quiser ver como eu fiz.CREATE (1).txt

Share this post


Link to post
Share on other sites

Parece tudo certo faça um select antes e após o insert para ter certeza

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 johnklo
      COM BASE NA TABELA HR DO ORACLE
      Preciso criar uma sub-rotina (procedure) que imprima na tela o número de funcionários (employees) agrupados por departamentos (department_id). Deve-se ordenar a saída em ordem decrescente pela quantidade de departamentos. Pode-se utilizar qualquer forma de cursor para imprimir o resultado.
    • By EREGON
      Olá,
      ao chamar a função, estou a receber o erro:
       
      "ORA-01422: extracção exacta devolve mais que o número pedido de linhas"
       
      create or replace FUNCTION "CALC_ADDT_SIM_DISC" (ACCT_INPUT VARCHAR2) RETURN VARCHAR2 IS SIM_MSISDN VARCHAR2(20); BEGIN SELECT CASE WHEN ADDT_DISC_1 = 1 THEN mu.MSISDN WHEN ADDT_DISC_1 > 1 THEN (SELECT DISTINCT t02.MSISDN FROM CDM.DMKV_TRANSP_VAR_RESULT_02 t02 WHERE SERV_ACCT_OLDER_MSISDN_FLG = 'Y' AND PRICING_PLAN_TYPE IN ('valor1', 'valor2') AND t02.DW_SERV_ST_ID='100000003' AND t02.CUST_ACCT_EXT_KEY = ACCT_INPUT ) END MSISDN_ADDT_DISC INTO SIM_MSISDN FROM( SELECT DISTINCT CUST_ACCT_EXT_KEY, COUNT(CUST_ACCT_EXT_KEY) AS ADDT_DISC_1 FROM MOBILE_UPSELL WHERE FLAG_ADDITIONAL_SIM_DISCOUNT = '0' GROUP BY CUST_ACCT_EXT_KEY )t, MOBILE_UPSELL mu WHERE t.CUST_ACCT_EXT_KEY = mu.CUST_ACCT_EXT_KEY AND t.CUST_ACCT_EXT_KEY = ACCT_INPUT; RETURN SIM_MSISDN; END; O que estou a fazer de errado?
       
      Obrigado
    • By Querendo_ser_Nerd
      Bom dia , 
       
      Pessoal, realizei diversas pesquisas em Fórum e Artigos, meu caso seria, criei uma aplicação na qual realiza a importação de arquivo em XLS em um DataGridView , está carregando a informação a principio em uma coluna (Duvida as colunas no Excel algumas contem sinais e espaço como "Cód. Cliente" como faço select * from [plan1$] para retornar apenas pela posição da coluna ex. select [A1] from [plan1$] ) , certo , carreguei no DataGrid, creei um botão para carregar as informações do data grid para o BD Oracle, passei toda a configuração conexão e realizei o INSERT , mas não popula com as informações do grid na tabela, apenas quando no INSERT ...Values (1) por exemplo o mesmo inseri o valor na tabela no banco. Já realizei a depuração mas não consigo. Sou novo nessa linguagem. Obg pela Ajuda.
       
      using System; using System.Data; using System.Data.OleDb; // intregração Excel using System.Data.OracleClient; using System.Windows.Forms; namespace WindowsFormsLog {     public partial class Form4 : Form     {                  public Form4()         {             InitializeComponent();         }         private void button1_Click(object sender, EventArgs e)         {             OpenFileDialog openFileDialog = new OpenFileDialog();             if(openFileDialog.ShowDialog()== System.Windows.Forms.DialogResult.OK)             {                 this.textBox1.Text = openFileDialog.FileName;             }         }                 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)         {                     }         public void button2_Click_1(object sender, EventArgs e)         {              string PathCpnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';";             OleDbConnection conn = new OleDbConnection(PathCpnn);             //LINQ c#              OleDbDataAdapter myDbDataAdapter = new OleDbDataAdapter("Select *  from [Plan1$]", conn); // planilha deve conter o nome Plan1             DataTable dt = new DataTable(); // armazena dado               myDbDataAdapter.Fill(dt);               dataGridView1.DataSource = dt;             dataGridView1.Columns[0].HeaderText = "NROPEDCLIENTE"; //alterando nome das colunas             //  dataGridView1.Columns[1].HeaderText = "DTAINCLUSAO";                  }             private void Form4_Load(object sender, EventArgs e)         {         }         public void button3_Click(object sender, EventArgs e)         {             string OracleConn = @"Data Source = ok; User ID =ok ; Password = ok; Unicode = True";             OracleConnection conexao = new OracleConnection(OracleConn);                          try             {                                if (dataGridView1.Rows.Count > 1)                 {                     for (int i = 1; i <= dataGridView1.Rows.Count ; i++)//-1                     {                         int dataGridView1 = Convert.ToInt32(this.dataGridView1.Rows[i].Cells[0].Value);                         conexao.Open();                         OracleCommand comando = new OracleCommand ("insert into pedido values(@NROPEDCLIENTE)", conexao);                           comando.Parameters.AddWithValue("NROPEDCLIENTE", dataGridView1);                                             comando.ExecuteNonQuery();                         MessageBox.Show("Insert");                         conexao.Close();                     }                 }             }             catch (Exception)             {                 MessageBox.Show("Erro ao inserir"); // Sempre finaliza aqui depuração             }                      }                }     }
          
    • By emerod
      Boa tarde!
       
      Estou montando uma rotina de backup para um banco de dados oracle, com o seguinte comando:
       
      expdp compiere/compiere@COMPIERE directory=compierebkp schemas=compiere dumpfile=ExpDat.dmp NOLOGFILE=Y
       
      Porém está retornando estes erros:
       
      Conectado a: Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
      ORA-39001: valor de argumento invßlido
      ORA-39000: especificaþÒo de arquivo de dump incorreto
      ORA-31641: nÒo Ú possÝvel criar o arquivo de dump "c:\compiere2\data/ExpDat.dmp"
      ORA-27040: erro ao criar arquivo, nÒo foi possÝvel criar o arquivo
      Linux-x86_64 Error: 2: No such file or directory
      Additional information: 1
       
      O banco está instalado em uma maquina linux e eu estou montando o backup em uma maquina linux.
       
      Segue a tela com o detalhamento do erro:

       
      Alguém pode me ajudar?
       
      Obrigado
       
      Emerson Ricardo Rodrigues
       
       
    • By sadamkim
      Pessoal,  me deparei com um problema.
      Tenho uma Tabela, onde fica armazenada as transações dos clientes.
      Cada transação tem vários registros com o campo STATUS.
       
      Preciso fazer um MAX, para pegar a ultima transação por data, e assim saber qual foi o status da mesma.
      Mas ao utilizar o MAX e selecionar o campo STATUS ele me traz todos os registro, porque o mesmo não pode agrupar por status, por conter valores diferentes.
      É possível criar alguma forma de selecionar no meu caso a ultima transação por data (MAX) e trazer o campo status?
      Seja com alguma procedure, ou outra função do ORACLE.


×

Important Information

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