[ORACLE] ORDSYS.ORDDOC

0

Mam dwie tabele, jedna wypełniona

create table autorzy
(
aut_id NUMBER(10) PRIMARY KEY,
nazwa VARCHAR2(15), NOT NULL
);
commit;

create table przepisy
(
prze_id NUMBER(15) PRIMARY KEY,
autor NUMBER(10) REFERENCES autorzy(aut_id) NOT NULL,
nazwa_pliku VARCHAR2(50) NOT NULL,
przepis ORDDoc
);
commit;

insert into autorzy (aut_id, nazwa) values (1,'Retrose');
insert into autorzy (aut_id, nazwa) values (2,'tulipan');
insert into autorzy (aut_id, nazwa) values (3,'Opolanka');
insert into autorzy (aut_id, nazwa) values (4,'renigliwice');
insert into autorzy (aut_id, nazwa) values (5,'novijka');
insert into autorzy (aut_id, nazwa) values (6,'Dorota');
insert into autorzy (aut_id, nazwa) values (7,'Izaa');
insert into autorzy (aut_id, nazwa) values (8,'Edyta Rosner');
insert into autorzy (aut_id, nazwa) values (9,'grumko');
insert into autorzy (aut_id, nazwa) values (10,'krokodyl');

declare
dokument ordsys.ORDDoc;
ctx RAW(64) := NULL;
row_id urowid;
BEGIN
  INSERT INTO przepisy (prze_id, autor, nazwa_pliku, przepis)
    VALUES (1,1,'Cukinia_z_miesem.txt', ORDDoc.init('FILE','KNIGA','Cukinia_z_miesem.txt'))
              RETURNING przepis,rowid INTO dokument, row_id;
  dokument.import(ctx);
  UPDATE przepisy SET przepis = dokument WHERE rowid = row_id;
  COMMIT;
END;

podczas gdy chcę załadować plik to wywala mi błąd przy linii: dokument.import(ctx); o treści:

Niepoprawna liczba lub typy argumentów w wywołaniu 'IMPORT'.

0

Poradziłem sobie właśnie przez dopisanie:

dokument.import(ctx**,false**);

teraz mam następny problem:
chcę wyciągnąć właściwości dokumentu i jak stworzyłem sobie procedurę:

CREATE OR REPLACE PROCEDURE wlasciwosci
AS
dokument ORDSYS.ORDDOC;
ctx RAW(64) :=NULL;
BEGIN
SELECT przepis INTO dokument FROM przepisy WHERE prze_id = 1 FOR UPDATE;
dokument.setProperties(ctx,true);
DBMS_OUTPUT.PUT_LINE('Format pliku: ' || dokument.getformat);
DBMS_OUTPUT.PUT_LINE('Rozmiar dokumentu: ' || dokument.getContentlength);
DBMS_OUTPUT.put_line('Typ Mime: ' || dokument.getMimeType);
UPDATE przepisy set przepis = dokument WHERE prze_id = 1;
COMMIT;
END;
/

set serveroutput on;
execute wlasciwosci;

To procedura tworzy się bez żadnego błędu, natomiast po wywołaniu dostaje taki oto błąd (zmiana true na false przy dokument.setProperties(ctx,true); nie pomaga, jak w ogóle nie dałem ctx'a to się nie kompilowała):

Error starting at line 1 in command:
execute wlasciwosci;
Error report:
ORA-06510: PL/SQL: nieobsługiwany zdefiniowany przez użytkownika wyjątek
ORA-06512: przy "ORDSYS.ORDDOC", linia 486
ORA-06510: PL/SQL: nieobsługiwany zdefiniowany przez użytkownika wyjątek
ORA-06512: przy "MISIEK.WLASCIWOSCI", linia 7
ORA-06512: przy linia 1
06510. 00000 - "PL/SQL: unhandled user-defined exception"
*Cause: A user-defined exception was raised by PL/SQL code, but
not handled.
*Action: Fix the problem causing the exception or write an exception
handler for this condition. Or you may need to contact your
application administrator or DBA.

Przeglądałem tutaj: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28414/ch_docref.htm#i1088208 ale coś nie widzę rozwiązania

EDIT:

Dobra dodałem ten wyjątek:

  EXCEPTION
   WHEN ORDSYS.ORDDocExceptions.DOC_PLUGIN_EXCEPTION THEN
    DBMS_OUTPUT.put_line('DOC PLUGIN EXCEPTION caught');
   WHEN OTHERS THEN
    DBMS_OUTPUT.put_line('EXCEPTION caught');

i teraz przy wywołaniu procedury wywala mi: DOC PLUGIN EXCEPTION CAUGHT.

Generalnie plik o id = 1, to plik txt, ale mam w bazie też pliki *.doc i po zmienieniu id w procedurze dostaje ten sam błąd, niezależnie od ustawienia true lub false w properties.

0

całe info o tym błędzie to:
Cause: This exception is raised when the document plug-in raises an exception. :/
Zobacz najpierw czy po selekcie dokument nie jest null. Sugeruje się też żeby Rather then calling setProperties(), you can set the contentLength and mimetype attributes directly.
Masz uprawnienia do katalogu KNIGA?

0

Uprawnienia są przyznane. Select'a spróbuję. Hmm, skoro nie set.Properties() to jak w takim razie wyciągnąć rozszerzenie pliku, rozmiar pliku i coś jeszcze, żebym mógł później odpytać sobie bazę:

  1. zlicz i wypisz ile jest plików z rozszerzeniem txt a ile z doc
  2. zlicz wszystkie rozmiary plików
  3. wypisz pliki o rozmiarze większym od zadanego.

jednym z wymagań zadania jest właśnie potem odpytanie z wykorzystaniem wartości multimedialnych.

Ja potrafię jedynie wyciągnąć rozmiar dla zadanego pliku o konkretnym id i nazwie:

declare
dokument ORDSYS.ORDDOC;
ctx RAW(64) :=NULL;
BEGIN
select przepis INTO dokument from Przepisy where prze_id = 2 for update;
dokument.importFrom(ctx,'FILE','KNIGA','Kaczka_domowa.doc',FALSE);
dbms_output.put_line('Dlugosc: ' ||TO_CHAR(dbms_lob.getlength(dokument.getContent())));
DBMS_OUTPUT.PUT_LINE('Format pliku: ' || dbms_lob.getcontenttype(dokument.getContent()));
dbms_output.put_line(dokument.getSource());
UPDATE przepisy set przepis = dokument where prze_id = 2;
COMMIT;
END;

działa jedynie getlength, bo już getcontenttype wyświetla tylko "Format pliku: " i żadnej wartości :/

0

Dobra, doczytałem trochę odnośnie setProperties() http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28414/ch_docref.htm#i1088208 i taka ważna uwaga mi umknęła:

Note:
This method works for only natively supported audio, image, and video formats. See Appendix A, Appendix B, and Appendix C, respectively, for information about natively supported audio, image, and video formats.

Dokumentów brak :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1