Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.tools -> Re: PL/SQL: variable column & table name in select

Re: PL/SQL: variable column & table name in select

From: Stephan Born <stephan.born_at_beusen.de>
Date: Thu, 11 Jan 2001 18:34:10 +0100
Message-ID: <3A5DEE92.582F20CF@beusen.de>

> Hi, All!
> Help me please, I've broken my head on this problem :). The situation is as
> follows: I need making a procedure on PL/SQL to get the max number of the
> first column in any table (of course if this column is numeric). How can I
> say in SELECT "first column in any table"? The procedure looks something
> alike:
> procedure max_number (table_name varchar2,
> maxnum number) is
> begin
> select max([What here?]) into maxnum from [What here?];
> dbms_output.enable;
> dbms_output.put_line('maxnum='||to_char(maxnum));
> end max_number;
>
> WBR, Viatcheslav.

Here is an anonymous pl/sql-block which does, waht you want

declare

	cid				number;
	stmt			varchar2(1000);
	rows_processed	number;
	result			number;
	tab_name		user_tab_columns.table_name%type := 'komned$netzknoten';
	dat				user_tab_columns.data_type%type;
	col_name		user_tab_columns.column_name%type;
begin
	select data_type, column_name
	into dat, col_name
	from user_tab_columns
	where 
		table_name = upper(tab_name) and
		column_id = 1;
--		
	if dat = 'NUMBER' then
		cid := dbms_sql.open_cursor;
--		
		stmt := 'select max(' || col_name || ') maxval from '|| tab_name;
		dbms_sql.parse (cid, stmt, dbms_sql.native);
--		
		dbms_sql.define_column (cid, 1, result); 
		rows_processed := dbms_sql.execute_and_fetch (cid, exact => true);
		dbms_sql.column_value (cid, 1, result);
--		
		dbms_sql.close_cursor(cid);
--
		/* to see this, type 'set serveroutput on' in sqlplus */
		dbms_output.enable(20000);
		dbms_output.put_line (result);
	end if;
exception
	when others then
		if dbms_sql.is_open (cid) then
			dbms_sql.close_cursor(cid);
		end if;
		raise;

end;

Im sure you can this easily rewrite it as a procedure. The package is used for 'dynamic SQL'...in Oracle8 (8i) it can be done more elegantly by

execute immediat stmt

Look into your manual for more

Regards, Stephan Received on Thu Jan 11 2001 - 11:34:10 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US