La Web del Programador: Comunidad de Programadores
 
    Pregunta:  52296 - ORDER BY CON VARIABLE
Autor:  Manuel Cambronero
Como puedo pasar a un Order By una variable dada por un usuario de una forma en Oracle. Osea Ordenar por esa variable

  Respuesta:  Manuel Cambronero
aqui esta un extracto de como se soluciona el problema, basados en que el Form no soporta utilizar el &:

PROCEDURE Ejemplo (p_orden in varchar2, p_fecha in date, p_compania in varchar2)IS

connection_id EXEC_SQL.CONNTYPE;
cursorID EXEC_SQL.CURSTYPE;
sqlstr VARCHAR2(15000);
nIgn PLS_INTEGER;

cod_cliente varchar2(15);
nom_cliente varchar2(100);
asesor_cli varchar2(100);
part_cli number;
fondo Varchar2(100):=mdb_pck_codigos.get_desc_fondo(:global.cod_compania);
part_cliente Number;
total_participaciones Number:=0;
v_monto Number:=0;
total_monto Number:=0;
/**/
application OLE2.OBJ_TYPE;
workbooks OLE2.OBJ_TYPE;
workbook OLE2.OBJ_TYPE;
worksheets OLE2.OBJ_TYPE;
worksheet OLE2.OBJ_TYPE;
cell OLE2.OBJ_TYPE;
args OLE2.LIST_TYPE;
hFontObj2 ole2.obj_type;
cell_value varchar2(2000);
--OBJ OLE2.OBJ_TYPE;
V_fila NUMBER(3);
V_columna NUMBER(3);
v_catalogo VARCHAR2(20) := 'RPM';
V_num_hoja NUMBER(3);
V_PRC_DIA NUMBER;
v_contador number:=0;
v_ruta varchar2(20);
/**/
Begin
sqlstr:= 'Select '||'to_number(con.f_cod_cliente)cod_cliente, cli.nombre,
mdb_pck_asesor.GET_NOMBRE_ASESOR(con.f_cod_cliente)asesor,
-- sum(con.can_participaciones_original)participaciones
sum( DM_SALDO_DIA(:compania, con.k_tip_contrato,
con.k_num_contrato,'||':fecha'||') ) participaciones'||
' From '||'admmdb.mdb_contrato con,admmdb.mdb_v_cliente cli,admmdb.mdb_tipo_contrato tip'||
' Where '||'con.k_cod_compania=:compania'||
' and '||'con.estado_contrato in ('||'''A'''||','||'''T'''||')' ||
' and '||'con.k_tip_contrato = tip.k_tip_contrato'||
' and '||'tip.tipo ='||'''E'''||
' and '||' trunc(fec_contrato) <= '||':fecha'||
' and '||'(fec_terminacion is null or fec_terminacion > '||':fecha'||')' ||
' and '||'con.f_cod_cliente = cli.cod_cliente' ||
' Group by '||' con.f_cod_cliente,cli.nombre';

IF p_orden = '1' then
sqlstr := sqlstr||' Order by 1';
else IF p_orden = '2' then
sqlstr := sqlstr||' Order by 2';
else IF p_orden = '3' then
sqlstr := sqlstr||' Order by 3';
else
sqlstr := sqlstr||' Order by 4';
end if;
end if;
end if;
connection_id := EXEC_SQL.OPEN_CONNECTION('admmdb/admmdb@produc');
cursorID := EXEC_SQL.OPEN_CURSOR(connection_id);
EXEC_SQL.PARSE(connection_id, cursorID, sqlstr, exec_sql.V7);
EXEC_SQL.BIND_VARIABLE(connection_id, cursorID, ':compania', p_compania);
EXEC_SQL.BIND_VARIABLE(connection_id, cursorID, ':fecha', p_fecha);
EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 1, cod_cliente, 30);
EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 2, nom_cliente, 100);
EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 3, asesor_cli, 100);
EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 4, part_cli);
nIgn := EXEC_SQL.EXECUTE(connection_id, cursorID);
V_PRC_DIA := mdb_pck_cierre.get_precio_dia(:global.cod_compania,:rec.fecha);
V_fila:=11;
V_columna:=1;
WHILE (EXEC_SQL.FETCH_ROWS(connection_id, cursorID) > 0 ) LOOP
--nRows := nRows + 1;--Message('3');
EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 1, cod_cliente );
EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 2, nom_cliente );
EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 3, asesor_cli);
EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 4, part_cli);
v_columna := 1;
ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,lpad(cod_cliente,6,'0'));
v_columna := v_columna +1;
ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,nom_cliente);
v_columna := v_columna +1;
ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,asesor_cli);
v_columna := v_columna +1;
ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,part_cli);
v_columna := v_columna +1;
v_monto := part_cli* v_prc_dia;
ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,v_monto);
v_columna := v_columna +1;
total_participaciones:=total_participaciones+part_cli;
v_fila:= v_fila + 1;
END LOOP;
exec_SQL.CLOSE_CURSOR (cursorID);
ORACLE_EXCEL.Mostrar_Libro (application,TRUE);
End ;

espero que se entienda y no se pierda mucho el formato.
Gracias