Wpis z mikrobloga

Cześć mireczki, mam sprawę. Otóż mamy sobie taki kod:

WITH gg AS(
SELECT
powerplanttypeid, description, id, ROWNUMBER()
OVER (
PARTITION BY powerplanttypeid ORDER BY id) AS pptid
FROM powerplant
)
SELECT id, description,TO
CHAR(pptid) ||TOCHAR(powerplanttypeid) AS NRP FROM gg ORDER BY ID;

który zwraca śliczną tabelkę z ponumerowanymi recordami według kolejności i typu elektrowni (lewa tabelka na rysunku)
tzn.
jeśli jest elektrownia typu '1' i jest pierwsza z tej kategorii, to dostaje przypisanie '11',
jeśli jest elektrownia typu '1' i jest druga z tej kategorii, to dostaje przypisanie '21',
jeśli jest elektrownia typu '2' i jest pierwsza z tej kategorii, to dostaje przypisanie '12'
i tak dalej ...

Prawa tabelka to efekt fizycznego wklepania tam pozycji za pomocą INSERT INTO.

Cały kod PL/SQL wypełniający kolejnymi "elektrowniami" tabelę:

-- GENERATOR for power
plant table --------------------------------------------------
create or replace procedure powerplantpop(valnbr integer )
is
valnbr number := valnbr;
decl VARCHAR2(600);
power
plantcode VARCHAR2(64);
power
planttypeid CHAR(7);
description VARCHAR2(64);
location VARCHAR2(128);
active CHAR(1);
dateactivefrom TIMESTAMP;
dateactiveto TIMESTAMP;
maxppt INT;
begin

SELECT MAX(powerplanttype.typename) INTO maxppt FROM powerplanttype;
for i in 1..val
nbr loop
powerplanttypeid:=TRUNC(round(dbmsrandom.value(1,maxppt)));
description:=dbmsrandom.string('U',20);
location:=dbms
random.string('U',20);
active:=TRUNC(round(dbmsrandom.value(0,1)));
date
activefrom :=TOTIMESTAMP(sysdate - (dbms_random.value(0,i)*10)-600); /*+0.5*/
dateactiveto :=TOTIMESTAMP(sysdate - dbmsrandom.value(0,i)); /*+0.1*/
powerplantcode:=ROUND(TOCHAR(dbmsrandom.value(0,100))) || powerplanttypeid ;

decl:= 'insert into power
plant values (seqpowerplant.nextval,:1,:2,:3,:4,:5,:6,:7)';
execute immediate decl using powerplantcode,powerplanttypeid, description, location, active, dateactivefrom,
date
activeto;

end loop;
commit;
end;
/

Niestety, ale ten kod generuje losowe kody (i doskonale o tym wiem). Tabela power
plant wygląda tak:
CREATE TABLE powerplant (
id INT NOT NULL PRIMARY KEY,
power
plantcode VARCHAR2(64) NOT NULL,
power
planttypeid CHAR(7) NOT NULL,
description VARCHAR2(64),
location VARCHAR2(128),
active CHAR(1),
dateactivefrom TIMESTAMP,
dateactiveto TIMESTAMP,
CONSTRAINT powerplantpowerplanttypefk FOREIGN KEY (powerplanttypeid) REFERENCES
powerplanttype(typename),
CONSTRAINT bool
pp CHECK (active IN ('0', '1'))
);

Pytanie: czy da radę w PL/SQLu zrobić tak, żeby kod automatycznie przypisywał kolejnym rekordom takie przypisania jak wypluwa ten pierwszy SELECT i widoczny jest efekt w postaci kolumny NRP? Albo przenieść posortowane wartości z kolumny NRP do kolumny powerplantcode Od razu zaznaczam, że kolejność wpadania elektrowni i ich typów jest losowa, ale taka nie musi być. Wszystko w tych tabelach może być losowe, ale koniecznie ma wpisywać do POWERPLANTCODE dane w wyżej podanym formacie.

Umie ktoś? :( Bo już m-ty dzień nad tym siedzę i albo to jest coś bardzo prostego albo po prostu jestem cienki jak wiadomo co węża z tego PL/SQLa (,)

EDIT: Typów elektrowni jest 7.
#oracle #sql #bazydanych #plsql #programowanie
Pobierz Awerege - Cześć mireczki, mam sprawę. Otóż mamy sobie taki kod:

WITH gg AS( 
SELE...
źródło: comment_1585337320k31rfT1xQxcq5Gf0PGOEed.jpg
  • 4
@Awerege: problem polega na tym, że idziesz w pętli i nie masz od razu wszystkich ID dla danej wartości powerplanttypeid. Musisz podzielić proces na etap generowania danych i wyliczania NRP (np. zbierz rekordy do jakiejś kolekcji). Alternatywnym rozwiązaniem (ale gorszym wydajnościowo) byłoby robienie selecta dla każdego wygenerowanego rekordu. Jak już masz powerplanttypeid, to pytasz bazy o wszystkie pozostałe ID z tym samym powerplanttypeid i masz swój NRP.