how to create procedure in oracle if i want to sum items who are product of multiply 2 values from 2 tables

StackOverflow https://stackoverflow.com/questions/21883336

  •  13-10-2022
  •  | 
  •  

문제

I want to create procedure in oracle which will summ all items and tell me if all items are > 50.000. Problem is that i need to multiply values from 2 different tables. Any help is highly appreciated. Here is the code down below.

create or replace 
PROCEDURE         "SUMASTAVKI" (sifraRacuna IN NUMBER) AS  
suma NUMBER:=0;
BEGIN  
    SELECT SUM(KOLICINA * CENA) INTO suma  
    FROM "STAVKARACUNA" sr
    WHERE "RACUNID"=sifraRacuna; 
    if (suma>50000)
  then
  begin
  UPDATE "RACUN"
    SET "VREDNOST"=suma, "POPUST"='da'
    WHERE "RACUNID"=sifraRacuna;end;
  else
  begin
  UPDATE "RACUN"
    SET "VREDNOST"=suma, "POPUST"='ne'
    WHERE "RACUNID"=sifraRacuna;end;
  end if;
END;

it writes an error: "CENA" is invalid identifyer

DDL for table PROIZVOD where value CENA is :

   CREATE TABLE "NST"."PROIZVOD" 
   (    "PROIZVODID" NUMBER(7,0), 
    "NAZIV" VARCHAR2(50 BYTE), 
    "CENA" NUMBER(7,2), 
     CONSTRAINT "PK_PROIZVOD" PRIMARY KEY ("PROIZVODID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM" ;

DDL for table STAVKARACUNA is:

     CREATE TABLE "NST"."STAVKARACUNA" 
   (    "RACUNID" NUMBER(7,0), 
    "RB" NUMBER(7,0), 
    "PROIZVODID" NUMBER(7,0), 
    "KOLICINA" NUMBER(7,0), 
     CONSTRAINT "PK_STAVKARACUNA" PRIMARY KEY ("RACUNID", "RB")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"  ENABLE, 
     CONSTRAINT "FK_RACUNNASTAVKURACUNA" FOREIGN KEY ("RACUNID")
      REFERENCES "NST"."RACUN" ("RACUNID") ON DELETE CASCADE ENABLE, 
     CONSTRAINT "FK_PROIZVODNASTAVKURACUNA" FOREIGN KEY ("PROIZVODID")
      REFERENCES "NST"."PROIZVOD" ("PROIZVODID") ON DELETE CASCADE ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM" ;
도움이 되었습니까?

해결책

If I understand correctly the select you use in your procedure should be as follows:

SELECT SUM(sr.KOLICINA * pr.CENA) INTO suma  
FROM STAVKARACUNA" sr, "PROIZVOD" pr
WHERE "RACUNID" = sifraRacuna
AND sr.PROIZVODID = pr.PROIZVODID

So your procedure will be:

create or replace PROCEDURE "SUMASTAVKI" (sifraRacuna IN NUMBER) AS  
  suma NUMBER:=0;
BEGIN  
    SELECT SUM(sr.KOLICINA * pr.CENA) INTO suma  
    FROM STAVKARACUNA" sr, "PROIZVOD" pr
    WHERE "RACUNID" = sifraRacuna
    AND sr.PROIZVODID = pr.PROIZVODID; 
    if (suma>50000) then
      UPDATE "RACUN"
      SET "VREDNOST"=suma, "POPUST"='da'
      WHERE "RACUNID"=sifraRacuna;
    else
      UPDATE "RACUN"
      SET "VREDNOST"=suma, "POPUST"='ne'
      WHERE "RACUNID"=sifraRacuna;
  end if;
END;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top