2015-12-23 2 views
2

Я создал форму, основанную на следующей таблице:Вставка изображения в таблицу в Oracle Apex

CREATE TABLE "POSTS" 
    ( "POST_ID" NUMBER(15,0) NOT NULL ENABLE, 
    "USER_ID" VARCHAR2(30) NOT NULL ENABLE, 
    "TITLE" VARCHAR2(255) NOT NULL ENABLE, 
    "TEXT" CLOB, 
    "RESPONSE_TO" NUMBER(15,0), 
    "FLAGGED" CHAR(1), 
    "MIMETYPE" VARCHAR2(50), 
    "LAST_UPDATE" DATE, 
    "THUMB" BLOB, 
    "IMAGE" "ORDSYS"."ORDIMAGE" , 
    "FILENAME" VARCHAR2(255), 
    CONSTRAINT "POSTS_PK" PRIMARY KEY ("POST_ID") 
    USING INDEX ENABLE 
    ) 
/
ALTER TABLE "POSTS" ADD CONSTRAINT "POSTS_CON" FOREIGN KEY ("RESPONSE_TO") 
     REFERENCES "POSTS" ("POST_ID") ENABLE 
/


CREATE INDEX "POSTS_TEXT_INDEX" ON "POSTS" ("TEXT") 
    INDEXTYPE IS "CTXSYS"."CONTEXT" 
/


CREATE INDEX "POSTS_TITLE_INDEX" ON "POSTS" ("TITLE") 
    INDEXTYPE IS "CTXSYS"."CONTEXT" 
/


CREATE OR REPLACE EDITIONABLE TRIGGER "BI_POSTS" 
    before insert on "POSTS"    
    for each row 
begin 
    if :NEW."POST_ID" is null then 
    select "POSTS_SEQ".nextval into :NEW."POST_ID" from sys.dual; 
    end if; 
end; 

/
ALTER TRIGGER "BI_POSTS" ENABLE 
/


CREATE OR REPLACE EDITIONABLE TRIGGER "NEW_POST" 
    BEFORE INSERT 
    ON posts 

FOR EACH ROW 
BEGIN 
    --l_image := ORDSYS.ORDImage.Init(); 
    --ORDSYS.ORDImage.process(:new.image, 'maxscale=200 200'); 

    :new.user_id := v(':APP_USER'); 
    --process_post_image(:new.post_id); 
END; 

/
ALTER TRIGGER "NEW_POST" ENABLE 
/

название, текст и имя файла редактируемых полей в форме.

Чтобы загрузить файл следующий код используется в пользовательском процессе вместо автоматически генерируемый код вставки:

DECLARE 

    l_upload_size INTEGER; 
    l_upload_blob BLOB; 
    l_image_id NUMBER; 
    l_image  ORDSYS.ORDImage; 

BEGIN 

    -- 
    -- Get the BLOB of the new image from the APEX_APPLICATION_TEMP_FILES (synonym for WWV_FLOW_TEMP_FILES) 
    -- APEX 5.0 change from APEX_APPLICATION_FILES which has been deprecated 
    -- APEX_APPLICATION_TEMP_FILES has fewer columns and is missing doc_size 
    -- 

    SELECT 
    blob_content 
    INTO 
    l_upload_blob 
    FROM 
    apex_application_temp_files 
    WHERE 
    name = :P16_FILENAME; 
    -- 
    -- Insert a new row into the table, initialising the image and 
    -- returning the newly allocated image_id for later use 
    -- 
    INSERT 
    INTO 
    posts 
    (
     post_id, 
     title, 
     text, 
     filename, 
     image 
    ) 
    VALUES 
    (
     posts_seq.nextval, 
     :P16_TITLE, 
     :P16_TEXT, 
     :P16_FILENAME, 
     ORDSYS.ORDImage() 
    ) 
    RETURNING 
    post_id, image 
    INTO 
    l_image_id, l_image; 

    -- find the size of BLOB (get doc_size) 
    l_upload_size := dbms_lob.getlength(l_upload_blob); 
    -- copy the blob into the ORDImage BLOB container 
    DBMS_LOB.COPY(l_image.SOURCE.localData, l_upload_blob, l_upload_size); 

    -- set the image properties 
    l_image.setProperties(); 

    UPDATE 
    posts 
    SET 
    image  = l_image -- original ORDImage image 
    WHERE 
    post_id = l_image_id; 

END; 

location of the custom process

Но получается следующее сообщение об ошибке:

Invalid action CREATE on this object. (D) 

enter image description here

ответ

1

Если вы перемещаете блоб, я был в состоянии успешно преобразовать двоичный объект в ordImage используя

UPDATE images 
SET ord_image = ORDSYS.ORDImage(image) 
WHERE ... 

И триггер нуждается двоеточие удалены здесь

:new.user_id := v('APP_USER'); 

Я часто использую

COALESCE(apex_application.g_user, sys_context('userenv','session_user')) 
+0

Я также способный установить ORDImage из BLOB с помощью запроса Update, но после этого я не могу использовать фактические функции ORDImage пользователя, такие как 'select post_id, t.image.getfileformat(), t.image.getcompressionformat(), t.image.getcontentformat() , t.image.getcon tentlength() из сообщений t; ' Пожалуйста, помогите мне, если у вас или у @HedgepigMatt есть какие-либо идеи, я очерняю способ прямого хранения изображения в ORDImage через страницу формы Apex, если это возможно. Также мне было интересно, повлияет ли этот процесс BLOB на ORDImage на качество загружаемых носителей? –

+0

ORDImages - это просто капли, которые хранят слой глубже. Что происходит при попытке выполнить эту функцию? – Scott

Смежные вопросы