具有可变列别名的过程结果-PLSQL / Oracle

时间:2019-03-12 13:25:59

标签: oracle stored-procedures plsql dynamic-sql

我已经在TOAD / PLSQL中运行了此过程,但是希望将第一列的别名设置为传递给该过程的field_name参数。我想我需要将查询构建为像这样的字符串,

query := 'Select 1 as ' || field_name || ' From Dual';

但是我做错了。我的想法有可能吗?

谢谢,下面是我要修改的工作代码。

Create or Replace Procedure Delete_Me(field_name NVarChar2)
as
result_set sys_refcursor;

BEGIN

open result_set for 

    Select
         Elapsed_Time((Select Start_Time From Temp_Time1)) as field_name
        ,To_Char(SysDate, 'HH12:MI:SS AM') as Time_Completed
        ,Elapsed_Time((Select Start_Time From Temp_Time0)) as Process_So_Far
    From
         Dual;

    DBMS_SQL.RETURN_RESULT(result_set);     

End;

评论后:

我向过程传递了一个字符串,并将其值放在“ field_name”中。我希望第一列的别名采用field_name的值。因此,如果我这样调用程序:

BEGIN
DeleteMe('Random_Column_Name');
END;

第一列名称将被称为“ Random_Column Name”。如果我这样调用程序:

BEGIN
DeleteMe('Different_Column_Name');
END;

第一列将是名称“ Different_Column_Name”。

在德米特里(Dmitry)的第二条评论之后: 没什么意思这是我尝试并未能成功工作的一个示例。

2 个答案:

答案 0 :(得分:0)

我知道您需要进行动态查询,这种方式很有趣:

DECLARE
    TYPE ty_refcur IS REF CURSOR;

    c_mycur  ty_refcur;
    whatever varchar2(200) := 'whatever';
    my_query varchar2(500);

BEGIN
    my_query := 'Select ''hello''as '||whatever||' from dual';
    OPEN c_mycur FOR my_query;
      --whatever you want to do
    CLOSE   c_mycur;
END;

答案 1 :(得分:0)

这就是我最终想出的。斯坦尼米尔(Stanimir)帮助我了解了变量的使用方式。谢谢你!

Create or Replace Procedure Report_Elapsed_Time(field_name0 NVarChar2,
                                                field_name1 NVarChar2)
    as
    result_set sys_refcursor;
        query VarChar2(30000);
    BEGIN

        query := 'Select
                         Elapsed_Time((Select Start_Time From Temp_Time1)) as ' || Replace(field_name0, ' ', '_') || '
                        ,To_Char(SysDate, ''HH12:MI:SS AM'') as Time_Completed
                        ,Elapsed_Time((Select Start_Time From Temp_Time0)) as ' || Replace(field_name1, ' ', '_') || '
                  From
                         Dual';

        open result_set for query;

        DBMS_SQL.RETURN_RESULT(result_set);     

    End;