Sauvegarde et récupération de données CLOB supérieure à 32 KO dans Oracle Apex
Mon but est de récupérer des données CLOB à partir de la base de données dans un textarea dans un Oracle Apex de l'application et ensuite être capable de l'enregistrer dans la base de données à partir de la textarea lui-même en appuyant sur un bouton "Enregistrer". J'ai aussi quelques autres champs de cette page (comme textfields) qui sont non CLOB champs et ils doivent être enregistrés dans la base de données en cliquant sur le bouton.
Pour cela, je suis en utilisant le code suivant sous "HTML-Tête et le Corps de l'Attribut" de la page. Ce est utilisé pour récupérer/sauvegarder CLOB dans le textarea/base de données. Note qu'un simple code PLSQL à l'intérieur de l'Apex point suffira à faire ce que je fais ici, mais seulement si les données CLOB est inférieure à 32k octets. Je suis à l'aide de cette fonction en raison de la 32k limite en plsql dans l'apex (et 4k limite lorsque sql est utilisé).
function clob_set(){
var clob_ob = new apex.ajax.clob(
function(){
var rs = p.readyState
if(rs == 1||rs == 2||rs == 3){
$x_Show('AjaxLoading');
}else if(rs == 4){
$s('P5075_RESPONSETEXT',p.responseText);
$x_Hide('AjaxLoading');
}else{return false;}
}
);
if(!$v_IsEmpty('P5075_STYLESHEET')){clob_ob._set($v('P5075_STYLESHEET'))};
}
function clob_get(){
var clob_ob = new apex.ajax.clob(
function(){
var rs = p.readyState
if(rs == 1||rs == 2||rs == 3){
$x_Show('AjaxLoading');
}else if(rs == 4){
$s('P5075_STYLESHEET',p.responseText);
$x_Hide('AjaxLoading');
}else{return false;}
}
);
clob_ob._get();
}
Je vais appeler une des fonctions de sous "Page HTML du Corps de l'Attribut" comme onload = "javascript:clob_get();"
J'ai un PLSQL après l'en-tête de ce processus.
declare
l_clob clob:= empty_clob();
begin
if apex_collection.collection_exists(p_collection_name=>'CLOB_CONTENT') then
apex_collection.delete_collection(p_collection_name=>'CLOB_CONTENT');
end if;
apex_collection.create_or_truncate_collection(p_collection_name=>'CLOB_CONTENT');
dbms_lob.createtemporary( l_clob, false, dbms_lob.SESSION );
SELECT xslt
INTO l_clob
FROM schematransform
WHERE namn = 'f';
apex_collection.add_member(p_collection_name => 'CLOB_CONTENT',p_clob001 => l_clob);
end;
Cela fonctionne très bien. Maintenant, j'ai un plsql processus qui enregistre les informations saisies dans le CLOB et non CLOB des champs dans la base de données. Mais dès que la page présente, je reçois une "HTTP Bad Request".
Quelqu'un peut-il expliquer pourquoi est-ce qui se passe et comment puis-je résoudre ce problème?
J'utilise Apex 4.1. J'ai testé avec CLOB taille de 90 octets, et aussi grand que 50 octets. Je vais avoir le même problème. Je suis de la CLOB dans le textarea correctement. C'est juste que lorsque j'appelle la fonction javascript lors du chargement de la page, puis soumettre la page, j'obtiens cette erreur. Le processus de sauver les objets textfield est de type "PLSQL bloc Anonyme" et le processus est "À la Charge Après l'en-Tête". Ce processus est soumis lorsque je clique sur un bouton nommé "Enregistrer".Le problème que je vois est un conflit entre 'onload de la page d'appel javascript' et 'page ' soumettre' après.
Je ne suis pas sûr si je comprends bien: le chargement de la Page, sur-charge de feux, vous obtenez clob valeurs. Vous effectuez des modifications. Vous cliquez sur un bouton qui envoie la page, et que vous attendez les champs avec clob-de sauvegarder les valeurs de la collection? - Il Correct?
Presque correct. Je ne suis pas d'économie sur les champs CLOB valeurs (pour l'instant). Il y a d'autres domaines comme bien d'ailleurs CLOB (nom, titre), qui sont de type VARCHAR. Sur submit, je veux enregistrer ces valeurs dans la base de données.
Si l'erreur est sur le présenter, il est possible que vous devez d'abord supprimer la valeur de l'élément contenant le rcocl, de sorte qu'il n'est pas soumis avec les autres champs. Vous pouvez le faire par la désactivation de l'élément ou de l'affichage uniquement. Ou vous pourriez rewire votre soumettre le processus de première null cet élément de valeur.
OriginalL'auteur Snow Leopard | 2012-07-09
Vous devez vous connecter pour publier un commentaire.
Ceci est le code de l'apex.ajax.clob, prise de apex_4_1.js:
Donc, clob paramètre et il est vraiment asynchronuous. Le code que vous avez posté fournit une fonction de gestion qui est appelé lorsque la demande n'est pas terminée (fait en htmldb_get). Je pense que c'est un vilain solution de contournement, mais ok. Nous avons besoin de manipuler ce code de fonction pour présenter notre travail. Depuis que le jeu est asynchrone, nous ne pouvons pas être sûr que la page ne sera pas présenté avant le jeu a eu lieu. Pour éviter cela, modifier votre clob_set code:
Modifier votre bouton soumettre, et ont un jeu d'action définies par une dynamique d'action. Vous avez besoin de le faire pour empêcher le remplacement de votre clob-champs à la session par l'intermédiaire du processus par défaut. Créer une dynamique d'action qui exécute le javascript, appel clob_set avec pSubmit ensemble:
Ont un look à la l'apex.soumettre description de l'api. Également comprendre comment un bouton fonctionne: il soumet la page et le demande au nom de ce bouton (ou une autre valeur si explicitement défini).
Par exemple, un bouton peut être nommé "APPLY_CHANGES et d'avoir une étiquette de "Changement". Ceci est important si vous utilisez par exemple le construit-dans la ligne de traitement. La demande de la valeur de déterminer SQL-action sera invoqué, et vous pouvez afficher les valeurs possibles dans les détails du processus, à côté des cases à cocher pour les insert/update/delete.
Ici, l'un des plus utiles belle organigramme:
Ce que j'essaie de faire est de pas laissez les champs qui contiennent les clob valeur sera soumis à la session, car nous voulons éviter la 32k limites. Non clobs doit être traitée normalement. Donc, ce que je voulais faire ici est d'abord de sauver ceux clob à travers champs clob_set, puis de désactiver une de ces clob-champs, puis soumettre la page. Cela devrait conduire à avoir votre clob valeur dans la collection, et vos autres objets dans l'état de session. J'espère que clob_set est-ce que vous/moi/nous attendons de il cependant! Si vous avez un code erreur ou alors, à la poste. Si ma méthode n'est pas claire, peut-être un exemple pourrait aider?
Oh ok, je comprends maintenant. Merci beaucoup pour le merveilleux explication. Permettez-moi de donner de mon mieux pour lui, maintenant que je l'ai compris. Je vais vous laisser savoir si les choses fonctionnent ou pas. Avoir un grand week-end 🙂
Salut Tom! J'ai essayé avec la dynamique des actions. Le non clob champs sont sauvés maintenant sans problème. Le CLOB champs sont sauvés, mais il y a un problème. Je dois appuyer sur le bouton "Enregistrer" deux fois pour l'enregistrer dans la base de données. Voici ce que j'ai fait. J'ai appelé clob_get() dans le pied de page de la région contenant les clob champ de sorte que je reçois les données clob dès que le chargement de la page.
J'ai fait une action dynamique sur le bouton "Enregistrer" avec l'Événement "Click". J'ai 2 vraies actions. Le 1er est "d'Exécuter du code Javascript' qui appelle clob_set() lorsque le bouton est cliqué et 2ème est 'Exécuter du code plsql", qui est l'enregistrement de la clob et non clob champs dans la base de données. L'événement de portée dans la dynamique de l'action est de "liaison".
OriginalL'auteur Tom