Call dynamic procedure
Hi gurus,
I have a question, how call a procedure as in the next example ?
create or replace package ppp....
procedure a is
pr varchar2(20):= 'b';
begin
b; -- Ok,
--but, how call to the procedure b since pr variable???
end;
procedure b is
begin
dbms_output.put_line('Ok');
end;
end;--package
thank's
A possible solution:
http://asktom.oracle.com/pls/ask/f?p=4950:8:10544037679792052173::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:30510198565645
Similar Messages
-
Calling a procedure from Dynamic Page
I am trying to call a procedure from a dynamic page. The procedure displays multi records from a table. I have created a procedure:
PROCEDURE process_student_request( p_primary_request in wwv_utl_api_types.vc_arr,
p_alternate_request in wwv_utl_api_types.vc_arr,
p_action in varchar2,
l_status in out varchar2);
When I hit the submit button on the dynamic page it does not execute the procedure and tries to open a new page. How do I get this to work?
Here is the text of the page:
<HTML>
<HEAD>
<TITLE>Example</TITLE>
</HEAD>
<BODY>
<FORM action="portal30.star_portal.process_student_requests" method="post">
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="2" CELLSPACING="0" class="RegionBorder">
<TR>
<TD valign="top" align="left" width="40%"><FONT class="PortletText1">
<ORACLE>declare
row_num number := 1;
hold_row_num number;
hold_class_cd stars3.req.class_cd%TYPE;
begin
for c1 in (select A.start_yy, A.school, A.student_id, A.class_cd, B.name from stars3.course B, stars3.req A
where A.student_id = portal30.star_portal.get_session_variable('STUDENT_ID') and A.start_yy = '01' and
A.alternate_no = '0' and
B.start_yy = A.start_yy and
B.school = A.school and
B.class_cd = A.class_cd)
loop
hold_class_cd := c1.class_cd;
htp.p(lpad(to_char(row_num),2,'0'));
htp.p('<select name="p_primary_request">');
htp.p('<option value="' || c1.class_cd|| '">' || c1.name || '</option>');
row_num := row_num + 1;
htp.p('<BR>');
end loop;
htp.p('<input type="submit" name="p_action">');
end;
</ORACLE>
</BODY>
</FORM>
</TD>
</TR>
</TABLE>
</HTML>Bob,
You have variables in your procedure like l_status, p_alternate_status which you do not have in the form. Are these IN or OUT variables ?
If these are IN variables, this proc will not work because you do not have any variable in the form. So from where does it get the values? There is not any default declared too. You have to explicitly define IN or OUT variables.
Have you also given execute permission to public ? -
Dynamic Page that calls DB procedure to update data gets PLS222 or PLS306
This seems a bit odd to me: I'm getting either "procedure no in scope" (when I call a procedure with the right args) or "wrong # or type of arguments" (when I call it with the wrong ones, so it is checking the procedure) in a dynamic page.<P>
I'm trying to build a dynamic page that will display data and checkboxes (basically to get around the multi-select limitations -- management has told me that the "fake" md form is not acceptable)<P>
So I build the page, it displays the data just fine exactly as we want it to:<P>
<HTML><FORM><ORACLE>declare
p_mdoc_user portal.wwv_utl_api_types.vc_arr;
p_mdoc_user_seq portal.wwv_utl_api_types.vc_arr;
p_seg_id portal.wwv_utl_api_types.vc_arr;
p_cb portal.wwv_utl_api_types.vc_arr;
p_action varchar2(20):='Save Changes';
begin
htp.p('Select your segments');
htp.p('< p>');
htp.p('<table border=2 cellpadding=2 cellspacing=0>');
htp.tablerowopen;
htp.tableheader('Seg#');
htp.tableheader('Included');
htp.tablerowclose;
for r1 in (select seg_id, build_seg
from web.mdoc_create_seg
where mdoc_user = :mdoc_user
and mdoc_user_seq = :mdoc_user_seq)
loop
htp.p('<input_type="hidden" name="p_mdoc_user" value='||:mdoc_user||'>');
htp.p('<input_type="hidden" name="p_mdoc_user_seq" value='||:mdoc_user_seq||'>');
htp.p('<input_type="hidden" name="p_seg_id" value='||to_char(r1.seg_id)||'>');
htp.p('<tr><td>');
htp.p(r1.seg_id);
htp.p('</td><td>');
if r1.build_seg='TRUE' then
htp.p('<input type="checkbox" name="p_cb" value="Y" checked>');
else
htp.p('<input type="checkbox" name="p_cb" value="Y">');
end if;
htp.p('</td></tr>');
end loop;
htp.p('</table>');
htp.p('< p>');
/*note, this is where I'm putting in a procedure call to update*/
end;
</ORACLE></FORM></HTML><P>
so then I try to add the procedure call (where the sql*plus comment is above)<P>
htp.p('<input type="button" value="Save Changes" onclick='||
mdoc_seg_create_choice_p(
p_mdoc_user,
p_mdoc_user_seq,
p_seg_id,
p_cb)
||'>');<P>
When I try to run as portlet, I get pls 222 not in scope. <but>
When I take a value out (say remove the last ",p_cb") - I get pls 306 wrong number or type of args to call.<P>
I've granted the procedure and its underlying tables to portal/public/and portal_public, even though I'm building the dynamic page under a DB provider that is the same as the schema I wrote the procedure in.<P>
I've tried specifying the schema, using a public synonym, and putting it in a package: same thing occurs, either I get pls 00222 not in scope when I call it with the right columns, or if I purposefully leave one out I get PLS 00306 wrong # or type of args.<P>
Any ideas?
-MikeHi guys
Check out the last 2 posts in this thread for ideas on how to implement 1.
Report on user data from LDAP
Varad -
Calling Stored procedures dynamically
Hi ,
I'm trying to call different Stored prcedures from my Java program based on different conditions.
I have the column values need to be passed as input params to the Stored Procedures.
But the sequence of values and the sequence of the input params inthe stored proc is different and morover the no of input params is different for different stored procedures.
Does anybody have any knowledge how to call dynamically the stored procedures or generalise the calls to some extent.
Any idea or thought will be appreciated.
Thanks
KrishHi ,
I'm trying to call different Stored prcedures from my
Java program based on different conditions.
I have the column values need to be passed as input
params to the Stored Procedures.
But the sequence of values and the sequence of the
input params inthe stored proc is different and
morover the no of input params is different for
different stored procedures.
Does anybody have any knowledge how to call
dynamically the stored procedures or generalise the
calls to some extent.
Any idea or thought will be appreciated.You need a simple interpreter/mapper.
Basically your problem is broken in to the following.
1. (set of params) maps to (proc)(param handler)
2. Analyze params to get map value.
3. Use param handle to populate proc
4. Call proc
5. Return values.
The last step is more complicated if you need to return a specialized version of the values. But in that case just add a (populate values handler) to the map.
Note that if you are doing this because you don't want to write code versus a real business need then you should investigate code generation. Generated code is easier to understand, easier to maintain and it faster versus using a generic handler. -
Best Way to call Dynamically an stored procedure
Hi Guys,
Here my question... I need to call dynamically to an stored procedure...
- the stored procedure can change, the name , the number of parameters
- the called stored procedure can contain output parameters.
lv_sql := 'BEGIN '|| lv_program_name || ' ( ' || get_parameters(lv_program_name) || '); END;';
get_parameters function generates an string depeding on the number of parameters that this function reads from the
oracle dictionary (i.e: ':1,:2,:3,:4......... )
then the dynamyc code must be executed as follow
execute immediate lv_sql
using .................................?????????
The issue that I am facing is how to handle the "using clause".... since before that I ran the program I dont know how many parameters the program will have...
Please your help... (or suggestion to solve in another way)
...:::OKMMAN:::...About "Satyaki_De " comment,
Since I dont know the stored procedure to be called, I cant know the number of parameters and its type to be returned... I mean.. to use the clause "using ...." in static way...
By now, I am creating dinamically a stored procedure... I am building a stored procedure that calls to the "unknown" stored procedure... reading the data dictionary and building dynamically the "Using...." clause... but I dont like ... since probably in production enviroment I will not have that kind of grants....
Regarding the link... I didn't know that new type... ! That's will solve the type issue... but still is pending the number of variable to provide to the "using" clause...
...:::OKMMMAN:::...
Edited by: okmman_cl on Feb 11, 2009 1:59 PM -
Getting ora-00900 error when calling the procedure with the dynamic sql.
create or replace procedure dyn_update(tab in varchar2,col in VARCHAR2) as
BEGIN
execute IMMEDIATE 'update'||tab||'set'||col||'= 0 where order_id=2458';
end;
and when i call this procedure in sql developer or sql* plus using
begin
dyn_update('Orders',Order_status');
end;
I am getting the oracle 0ra 00900 error.
can any one please help mejust a tip:
Create your dynamic string in a local variable, so you can easily see why it is giving an exception
create or replace procedure dyn_update(tab in varchar2,col in VARCHAR2) as
str varchar2(32767);
BEGIN
str := 'update '||tab||' set'||col||'= 0 where order_id=2458';
dbms_output.put_line (str);
execute IMMEDIATE str;
end; -
Calling a procedure dynamically in forms
Hi all
I'm using Oracle 6, is there anyway to call a procedure dynamically, i mean the procedure called differs according to a certain condition. The procedure is local in the form not in the database, how can this be achieved
ThanksHello,
user497979 wrote:
what i want is as the following
IF cond = 1 THEN
proc1;
ELSIF cond = 2 THEN
proc2;
ELSIF cond = 3 THEN
proc3;
.................. so onWell, i think the way you are showing with IF CONDITION is smart enough to call the procedures. And it will be also easy to understand.
I'm searching for a way to call the procedure as follows
proc||cond for exampleBut why? What is the purpose to do like this? Any efficiency or any logical reason?
Another option You can create one procedure and call the code depend on parameter you pass like
PROCEDURE MY_PROC(pCond IN NUMBER) IS
BEGIN
IF pCond=1 THEN
-- Do something here...
ELSIF pCond=2 THEN
-- Do something here...
ELSE
-- Do something here...
END IF;
END;And while calling the procedure you can call the procedure by passing the value of pCond upon your requirement like
MY_PROC(<parameter value>);But still the IF CONDITION exists either you use inside or outside the procedure.
-Ammad -
PL/SQL Dynamic procedure call - arrays
I'm having a lot trouble dynamically calling procedures that have an array as a parameter value. It looks like it's not possible as I'm getting the deadly 'PLS-00707 unsupported construct or internal error [num]' message.
Is that true, that I can't pass an array in a dynamic procedure call?
The example procedure I'm calling is,
PROCEDURE test(pusr in NUMBER,
ptble IN VARCHAR2,
prprt IN VARCHAR2,
pccyy IN VARCHAR2,
parea IN VARCHAR2,
pregn IN VARCHAR2 DEFAULT null,
poffc IN VARCHAR2 DEFAULT null,
ptime IN VARCHAR2,
pmnth IN NUMBER DEFAULT null,
pqrtr IN NUMBER DEFAULT null,
prow IN VARCHAR2 DEFAULT null,
carray IN array_pcat)
If I call it like this it works fine.
uwsdm_web.test(pusr=> 100,
ptble=>'mic',
prprt=>'MIC3',
pccyy=>'1999',
parea=>'Statewide',
pregn=>'0',
poffc=>'0',
ptime=>'Year',
pmnth=>0,
pqrtr=>0,
prow=>'1,2,3,4',
parray=> carray);
where carray is the array.
If I change the carray to a value (numeric or character), I get a "PLS-00306: wrong number or types of arguments in call to 'TEST'" error. Efforts to pass multiple values also failed.
If I try to dynamically create the query and pass in the variable of carray, I run into similar problems because it's trying to allocate an array to one line of code.
Any suggestions?
Thanks.
Kurt
nullApologizes for disturbing you,
as soon as I posted my question, I realized that there were some problems with the sintaxis I was using. Thank you very much and please excuse me for that silly question...
Miguel-Angel -
Creating parameters dynamically and calling a procedure but strange issue
Okay I have the following program that is calling a procedure(data_compare_utility)[pasted below] and data_compare_table_setup table definition and data(isert scripts) are pasted below :
DECLARE
--FP_OLD_TABLE VARCHAR2(200);
--FP_NEW_TABLE VARCHAR2(200);
--FP_DATA_COMPARE_ID NUMBER(10) := 1;
--FP_RESTRICTION_CLAUSE VARCHAR2(500) := 'WHERE W_INSERT_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'') OR W_UPDATE_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'')';
--FP_RESTRICTION_CLAUSE_4_INS VARCHAR2(500) := 'WHERE W_INSERT_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''') OR W_UPDATE_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''')';
cursor c_data_compare_table_setup
is
select table_name, old_schema_name, new_schema_name, data_compare_id, restriction_clause, restriction_clause_ins from DATA_COMPARE_TABLE_SETUP;
r_of_data_compare_table_setup c_data_compare_table_setup%rowtype;
Lv_args_4_data_compare_utility varchar2(500);
BEGIN
--FP_OLD_TABLE := 'BIAPPS_11.RAHUL_EMPLOYEES';
--FP_NEW_TABLE := 'RAHULKALRA.RAHUL_EMPLOYEES';
open c_data_compare_table_setup;
Loop
fetch c_data_compare_table_setup into r_of_data_compare_table_setup;
exit when c_data_compare_table_setup%NOTFOUND;
--exec RAHULKALRA.P_COMPARE_DATA_UTILITY
Lv_args_4_data_compare_utility := ''''||r_of_data_compare_table_setup.OLD_SCHEMA_NAME||'.'||r_of_data_compare_table_setup.TABLE_NAME||''','''||r_of_data_compare_table_setup.NEW_SCHEMA_NAME||'.'||r_of_data_compare_table_setup.TABLE_NAME||''','||r_of_data_compare_table_setup.DATA_COMPARE_ID||','''||r_of_data_compare_table_setup.RESTRICTION_CLAUSE||''','''||r_of_data_compare_table_setup.RESTRICTION_CLAUSE_INS||'''';
P_COMPARE_DATA_UTILITY(Lv_args_4_data_compare_utility);
commit;
End Loop;
dbms_output.put_line('rahul');
dbms_output.put_line(''''||r_of_data_compare_table_setup.OLD_SCHEMA_NAME||'.'||r_of_data_compare_table_setup.TABLE_NAME||''','''||r_of_data_compare_table_setup.NEW_SCHEMA_NAME||'.'||r_of_data_compare_table_setup.TABLE_NAME||''','||r_of_data_compare_table_setup.DATA_COMPARE_ID||','''||r_of_data_compare_table_setup.RESTRICTION_CLAUSE||''','''||r_of_data_compare_table_setup.RESTRICTION_CLAUSE_INS||'''');
--P_COMPARE_DATA_UTILITY('BIAPPS_11.RAHUL_EMPLOYEES','RAHULKALRA.RAHUL_EMPLOYEES',1,'WHERE W_INSERT_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'') OR W_UPDATE_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'')','WHERE W_INSERT_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''') OR W_UPDATE_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''')');
--P_COMPARE_DATA_UTILITY('BIAPPS_11.RAHUL_EMPLOYEES','RAHULKALRA.RAHUL_EMPLOYEES',1,'WHERE W_INSERT_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'') OR W_UPDATE_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'')','WHERE W_INSERT_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''') OR W_UPDATE_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''')');
close c_data_compare_table_setup;
END;
Procedure : compare_data_utility:
CREATE OR REPLACE procedure RAHULKALRA.p_compare_data_utility(fp1_old_table in varchar2, fp2_new_table in varchar2, fp3_data_compare_id in number, fp4_restriction_clause in varchar2, fp5_recrtiction_clause_4_ins in varchar2)
as
Lv_common_column_names varchar2(2000);
Lv_primary_column_name varchar2(50);
Lv_insert_data_compare_log varchar2(2000);
--Lv_counter number(10);
Lv_row_id_for_data_compare_log number(10);
Lv_old_table_record_count number(10);
Lv_old_table_rec_cnt_query varchar2(200);
Lv_new_table_record_count number(10);
Lv_new_table_rec_cnt_query varchar2(200);
begin
select max(row_id) into Lv_row_id_for_data_compare_log from data_compare_log;
Lv_old_table_rec_cnt_query := 'Select count(*) from '||fp1_old_table||' '||fp4_restriction_clause;
dbms_output.put_line(Lv_old_table_rec_cnt_query);
execute immediate Lv_old_table_rec_cnt_query into Lv_old_table_record_count;
Lv_new_table_rec_cnt_query := 'Select count(*) from '||fp2_new_table||' '||fp4_restriction_clause;
execute immediate Lv_new_table_rec_cnt_query into Lv_new_table_record_count;
dbms_output.put_line(fp5_recrtiction_clause_4_ins);
if (Lv_row_id_for_data_compare_log is null)
then
Lv_row_id_for_data_compare_log := 1;
else
Lv_row_id_for_data_compare_log := Lv_row_id_for_data_compare_log + 1;
end if;
Lv_insert_data_compare_log := 'insert into data_compare_log values('||Lv_row_id_for_data_compare_log||',''comparing data for '||fp1_old_table||' and '||fp2_new_table||''','''||fp1_old_table||''','''||fp2_new_table||''',TO_DATE('''||to_char(sysdate,'DD-MON-YY HH24:MI:SS')||''',''DD-MON-YY HH24:MI:SS''),'||fp3_data_compare_id||','||Lv_old_table_record_count||','''||'Select count(*) from '||fp1_old_table||' '||fp5_recrtiction_clause_4_ins||''','||Lv_new_table_record_count||','''||'Select count(*) from '||fp2_new_table||' '||fp5_recrtiction_clause_4_ins||''')';
dbms_output.put_line(Lv_insert_data_compare_log);
execute immediate Lv_insert_data_compare_log;
commit;
-- tested : dbms_output.put_line(Lv_insert_data_compare_log);
Lv_common_column_names := f_fetch_common_column_names(fp1_old_table,fp2_new_table,fp3_data_compare_id);
-- tested : dbms_output.put_line(Lv_common_column_names);
Lv_primary_column_name := f_extract_pkey_column_names(fp1_old_table, fp2_new_table);
dbms_output.put_line(Lv_primary_column_name);
p_compare_data(fp1_old_table,fp2_new_table,Lv_common_column_names,Lv_primary_column_name,fp4_restriction_clause,fp3_data_compare_id);
end;
CREATE TABLE RAHULKALRA.DATA_COMPARE_TABLE_SETUP
TABLE_ID NUMBER(10),
TABLE_NAME VARCHAR2(100 BYTE),
OLD_SCHEMA_NAME VARCHAR2(100 BYTE),
NEW_SCHEMA_NAME VARCHAR2(100 BYTE),
RESTRICTION_CLAUSE VARCHAR2(500 BYTE),
RESTRICTION_CLAUSE_INS VARCHAR2(500 BYTE),
DATA_COMPARE_ID NUMBER(10)
Insert into DATA_COMPARE_TABLE_SETUP
(TABLE_NAME, OLD_SCHEMA_NAME, NEW_SCHEMA_NAME, DATA_COMPARE_ID, RESTRICTION_CLAUSE, RESTRICTION_CLAUSE_INS)
Values
('W_CHNL_TYPE_D', 'BIAPPS_11', 'RAHULKALRA', 1, 'WHERE W_INSERT_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''') OR W_UPDATE_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''')', 'WHERE W_INSERT_DT >= TO_DATE(''''''''01/JAN/2012'''''''',''''''''DD/MON/YYYY'''''''') OR W_UPDATE_DT >= TO_DATE(''''''''01/JAN/2012'''''''',''''''''DD/MON/YYYY'''''''')');
Insert into DATA_COMPARE_TABLE_SETUP
(TABLE_NAME, OLD_SCHEMA_NAME, NEW_SCHEMA_NAME, DATA_COMPARE_ID, RESTRICTION_CLAUSE, RESTRICTION_CLAUSE_INS)
Values
('RAHUL_EMPLOYEES', 'BIAPPS_11', 'RAHULKALRA', 1, 'WHERE W_INSERT_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''') OR W_UPDATE_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''')', 'WHERE W_INSERT_DT >= TO_DATE(''''''''01/JAN/2012'''''''',''''''''DD/MON/YYYY'''''''') OR W_UPDATE_DT >= TO_DATE(''''''''01/JAN/2012'''''''',''''''''DD/MON/YYYY'''''''')');
I am facing the following error for this command when I call P_compre_data_utility procedure from my anonymous block:
P_COMPARE_DATA_UTILITY(Lv_args_4_data_compare_utility); -- the error is pasted below
if I do a dbms_output.put_line(Lv_args_4_data_compare_utility) and then copy paste its output and call P_COMPARE_DATA_UTILITY, the procedure is getting executed, here is that command :
P_COMPARE_DATA_UTILITY('BIAPPS_11.RAHUL_EMPLOYEES','RAHULKALRA.RAHUL_EMPLOYEES',1,'WHERE W_INSERT_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'') OR W_UPDATE_DT >= TO_DATE(''01/JAN/2012'',''DD/MON/YYYY'')','WHERE W_INSERT_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''') OR W_UPDATE_DT >= TO_DATE(''''01/JAN/2012'''',''''DD/MON/YYYY'''')');
Error:
ORA-06550: line 27, column 7:
PLS-00306: wrong number or types of arguments in call to 'P_COMPARE_DATA_UTILITY'
ORA-06550: line 27, column 7:
PL/SQL: Statement ignored
Question : just want to know whats wrong with : P_COMPARE_DATA_UTILITY(Lv_args_4_data_compare_utility);
please help me.
Regards
RahulMac_Freak_Rahul wrote:
Hi All,
I am really sorry, my head is so aching since I am not a regular plsql coder and to save my life I need to write this code for data comparison between 2 tables .. further sorry about calling p_data_compare utility stupidly : P_COMPARE_DATA_UTILITY(Lv_args_4_data_compare_utility);
I am calling it now using :
execute immediate 'exec P_COMPARE_DATA_UTILITY('||Lv_args_4_data_compare_utility||')';If you are sure the call works then, exec would not work since it is a SQLPLUS command.
try
execute immediate 'BEGIN P_COMPARE_DATA_UTILITY(''||Lv_args_4_data_compare_utility||''); END;';
PS: I can manually give table names to my utility , just need 60 tables to compare but would be great if I can work it out this eay.
2) I can sound very stupid since my head is aching I am not a regular plsql coder but from now on I would be one, please helpJust for your sake, to Compare 60 tables (Supposing you just want to verify count of records), you are writing an entire procedure; You might have completed this activity by now doing the manual way. By taking this way, you are investing time to generate a correct code (as you just mentioned not being a regular plsql developer) you are stuck with some un-identifiable issues.
As an alternate way, I would suggest you to export the data, after ordering, into a spreadsheet and then validate. Also, since it looks like you are comparing the data in the same database between schemas, you can also use the SQL Navigators Data Compare utility and there are many more readily available in market.
I would wish you the best if you still prefer taking the approach. -
Dynamically call another procedure
In SQLServer you can have a variable that holds a procedure
name. The variable can then be used in the execute statement.
Is there any way in PLSQL to dynamicaly call another procedure.
example:
begin
declare procname varchar2(32) = 'proc1';
--now call the procedure
procname -- ?
execute immediate procname -- ?
end;
Thanks,
Dermot.Just wrap it in an anonymous block:
create or replace procwrap
(p_procname in varchar2)
is
begin
execute immediate 'begin ' || p_procname || '; end;';
end; -
I have the need to save dynamically generated ApEx items via AJAX. I am using APEX_ITEM API to generate the items. At run-time, I have no idea how many of items will be generated on the page, but I know that they will all have discreet and distinct "name" attributes, i.e. f01, f02, f03, etc. As a basic example, if I have to generate a select list, I know that the "p_idx" parameter of the APEX_ITEM call is say "3", so all select lists that get generated will have a "name" attribute in the DOM of "f03", all text items will be "f01", etc.
I want to save this data to the database via AJAX. It is typical to call the standard htmldb_Get javascript function for use of an on-demand process, but I am interested in using the rarely-called-upon "procedure" and queryString" options of that javascript function so that I can build the queryString on the fly based on what is on the DOM when the tries to save the data they entered into these APEX_ITEM-generated items. Does anyone have any good examples of how to use the "procedure" and "queryString" parameters of the htmldb_Get javascript function?
I have found a smattering of some blogs, posts, etc. online related to this, but mostly just people regurgitating the documentation. I found this post (https://forums.oracle.com/thread/2549237) which had a glimpse of hope to be able to pass an array (which is something I will need) as a parameter, but would like someone to sanity check this before I go down that road.
Shane.
ApEx 4.2.1Shane
Since you mention you are on APEX 4.2 I would recommend using apex.server.process which is the documented replacement of the officially undocumented htmldb_Get.
In the documentation it is set that the first parameter is the ajaxidentifier but it actually is the process name.
The data object would be something like
var lData ={f01 : get_value_array('f01')}
Where get_value_array is
function get_value_array(pColumnName) {
var l_values =[];
apex.jQuery('[name="'+pColumnName+'"]').each(
function(){
var l_value;
l_value = apex.item(this.id).getValue();
l_values.push(l_value);
return l_values
For a working example see this demo.
Nicolette -
Calling packaged procedure from a URL link
I have created a custom APEX application the will allow us to dynamically build help screens for the pages we create with APEX.
In doing this I have created a procedure within a package called "comi_help_util.show_help".
This procedure uses the "htp.p" standard procedure to create a dynamic web page from data stored inside my help tables.
I want to place a "Help" link in the Navigation Bar which will call the custom procedure, pass the APP_ID and APP_PAGE_ID and popup in a new window.
I tried doing something like the Help link in APEX.
javascript:popupURL('comi_help_util.show_help?p_application_id=&APP_ID.&p_page_id=&APP_PAGE_ID.');
Unfortunately, I get "HTTP 404 - Web page cannot be found" error.
I know I could probably call a page within my APEX application from my custom Help link which would then call my custom procedure.
However, this means I would have to put a page within every application I want to use this on.
I believe the call to the procedure directly would be cleaner and easier to implement, if I can get this working on my first app.
I have never called a procedure thru a URL link or the javascript:popupURL and, try as I might, cannot search for the right keywords in the APEX forum or the Web.
Any help would be appreciated.
THANKS
RaymondHi Scott,
>> Time for new glasses ...
You are probably right, but regardless, I was referring to Raymond’s first post (and I should have made it clear). I noted that I believe your JavaScript statement is correct, I just can’t see the difference between it and the OP first statement, where, as far as I can see, he also used question mark (?) to mark parameters, and ampersand (&) to concatenate them. Still he received a 404 error. What am I missing there?
Thanks,
Arie.
Please remember to mark appropriate posts as correct/helpful. For the long run, it will benefit us all. -
PLSQL portlet - problem calling stored procedure -
Good day folks. My portal version 10.1.2. I have a dynamic page with multiple rows. For simplicity, example here has two columns => id and value. The initial dilemma - The stored procedure specified in the action attribute of the <form> tag has to have parameters that match in name and count to the fields on the html form. But, the number of rows is variable on the form. I currently use pl/sql to generate the page. I have two forms in the html - form A has two static fields id and value, with an action attribute of the stored procedure I want to run. The second html form is form B. It has id_1, value_1, id_2, value_2, id_3, value_3 and so on with a variable number of rows. SO, when the user clicks the "Submit" button at the bnottom of the page, I call a javascript passing in the number of rows. I then loop through the Form B, and for each row of data, I do a submit of Form A. My goal is to run the stored procedure in the database for each row of data in Form B. I use Form A to accomodate the requirement that the stored procedure has to match in name and number the parameters inthe form.
This is to avoid an update button on each row of data, also.
The problem - in my javascript, I set the values of Form A to the values from Form B correctly. However, only the last rowis successful in running the procedure. For example, if I have 3 rows in Form B, I want to submit form A 3 times, but, it only seems to submit once for row #3. The weird thing is if I put an alert message after the document.formA.submit(); command, the stored procedure is successfully called for each row in form B, but when I remove the alert, only the last row successfully calls the procedure!
Thanks in advance if anybody has any ideas -
KentLet's continue the example of 3 rows.
It sounds like that you submit the form 3 times in quick succession, and so before the Action for Form A has had time to run and respond for the first row, the second row has been submitted, and therefore the web page will stop trying to display the results from the submit of Row 1 (by this I mean it'll stop the http request, if you do this quick enough then the back-end function won't run). Then the same thing happens to Row 2's submit when Row 3 starts.
What it sounds like you need to do is to use only 2 parameters, but repeat them on the HTML page, when the submit is run it's passed to oracle as a type 'owa_util.vc_arr'. There is a more comprehensive solution to this problem in another thread:
passing variable number of arguments in a stored procedure
Please note though that you have to be careful of the situations where your form only has one row to submit to the oracle function, in this case the data type of the parameter will be a VARCHAR2 rather than a owa_util.vc_arr. The solution to this problem is to always have a an extra dummy parameter which is empty and you skip over it during your processing. (Thought I'd better include this information in case you ran into this problem).
Hope this helps.
Cheers,
Ron. -
Initial error in call to procedure is cached
Hi,
I'm running Apex 4.1.0.00.32, with Apex Listener 1.1.3.243.11.40 in WebLogic 10.3.3.0.
I've noticed that if I run a procedure (/apex/schema.procedure) and the first call is unsuccessful (because of an error in the procedure or lack of privilege), all later calls will also fail.
Example, create this procedure:
create or replace procedure bug as
begin
htp.p('Hello bug');
end;
Try to run it using the url http://<server>/apex/<schema>.bug
The web page will show just "Not Found". The listener error log will show
HTTP Status Code: 404 Requested url http://<server>/apex/<schema>.bug is not found.
The problem now is lack of grant. So, do a "grant execute on bug to apex_public_user;".
Refresh the web page but "Not Found" persists.
There are now two options:
- change the url to (for instance) http://<server>/apex/<schema>.Bug (ie change case)
- restart the whole weblogic server (stopping the Apex deployment is not possible)
As changing the case of the url is not practical if the application is generating links, a restart is the option left.
Is this "caching" of initial failure the expected behaviour or have I missed some configuration?
I have no caching enabled in the listener.
Kind regards
Tomas Albinsson
Stockholm, Swedenwhy would the listener look up metadata for the procedure to call?
Either the user has the correct procedure name and parameter names - the call succeeds.
Or the name or some parameter is wrong - the call fails and is reported to the user.Hi Tomas,
Let me just repeat again that I don't know exactly how the Apex Listener implements its database calls.
My comments are based on my own experiences from writing the Thoth Gateway, which essentially does the same thing as mod_plsql and the Apex Listener, except it is written in .NET and runs on Microsoft IIS. See http://code.google.com/p/thoth-gateway/ for more details.
One reason for caching the procedure metadata is this:
Let's say you have a procedure with a parameter which is a "table of varchar2" (such as the f01, f02, etc. parameters in the "wwv_flow.accept" procedure in Apex). These can accept zero, one or more values, depending on how many times you have repeated that input element name on the HTML page.
So the Listener receives a call for the "wwv_flow.accept" procedure with a single value for the "f01" parameter. Without looking in the data dictionary (see DBA_ARGUMENTS), there is no way the Listener can know that the f01 parameter is actually a "table of varchar2" (and needs to be bound as that datatype when invoking the stored procedure). If the value is bound as a string (plain varchar2) parameter, the procedure call fails.
Now, there are at least two ways to handle this: You can either catch the error, assume it was really a "table of varchar2" parameter, and try again with that; or you can look it up in the data dictionary beforehand to avoid the error. In either case, it's not good for performance to do this for every procedure call.
The Thoth Gateway actually works this way: It first checks whether it has cached metadata for the procedure. If not, it tries to call the procedure based on just the names and values. If this fails, it silently catches the error and then looks up the procedure metadata from the data dictionary to make sure the parameter types are correct. It then calls the procedure again (and hopefully that should be successful). Then the metadata is cached. Which means that any subsequent invocations of the same procedure don't need to go through the same work again.
Looking up (and caching) the metadata also has another benefit: If there are input elements on the HTML page that do not correspond to parameter names in the procedure (perhaps some client-side JS framework added some input fields dynamically), then the procedure call would fail. You can see this in action using mod_plsql and DBMS_EPG (you get an error along the lines of "arguments in form not in procedure..."). However, the Thoth Gateway (and I believe also the Apex Listener) checks the incoming parameter names against the metadata, and just discards any parameter names/values that are not in the procedure.
- Morten
http://ora-00001.blogspot.com
Edited by: mobra on Oct 20, 2011 10:52 AM -
Click selectlist item then call a procedure
Hi
Please
Can you advice for click selectlist item then call a procedure?
selectlist-> create dynamic action ->standart->
selection type=items
items= P2_SP
then I am confused .Did you mean "click" Select list or "change" select list ?
I am guessing that its "change" (click doesn't necessarily change anything in the page)
<li>Create Dynamic Action -> Advanced
<li>Name,Sequence
<li>Event:Change
<li> Selection Type : Item
Item Name
<li>Action : PLSQL
PLSQL Code
BEGIN
procedure_name(<parameters>);
END;Use the Items to submit field for any item that you use in the PLSQL code.
Maybe you are looking for
-
Diff between logical and physical file path
Hi , Could you please explain difference between logical and physical file path's and their importance in ABAP. Thanks and regards, shyla
-
Hi, is there any way to insert text function vertically in FR report? Like, the output should look like for Period dimension- J a n u a r y Thanks.
-
Default Payscale group and level
Hi Experts, Is there any way by which i can default the Payscale Group and Payscale Level? My payscale group is same as Employee Group and level is same as Employee Sub-group. Plz advice. regards TS
-
hi gurus, can any one send bex reporting material to my mail id? [email protected] thanks rs
-
Installing arch on extended partition/logical drive
hi there. i am a newbie to linux and about to install arch as my first linux installation. i am using vaio AR laptop already running xp and would like to keep it and have double boot without reinstalling xp. have 200gb hdd with recovery primary parti