Oracle相当于T-SQL集合@var=@var+'';;

Oracle相当于T-SQL集合@var=@var+'';;,sql,sql-server,oracle,plsql,oracle11g,Sql,Sql Server,Oracle,Plsql,Oracle11g,从SQL Server切换到Oracle。如何将字符串连接到循环中的变量?在SQL Server中,我会编写如下内容 DECLARE @var varchar(max); WHILE ([I'm doing something or whatever on a table]) BEGIN SET @var = @var + ' additional text'; END SELECT @var AS 'result'; 这是到目前为止我在Oracle中的存储过程。(将其发展为NHibe

从SQL Server切换到Oracle。如何将字符串连接到循环中的变量?在SQL Server中,我会编写如下内容

DECLARE @var varchar(max);
WHILE ([I'm doing something or whatever on a table])
BEGIN
    SET @var = @var + ' additional text';
END
SELECT @var AS 'result';
这是到目前为止我在Oracle中的存储过程。(将其发展为NHibernate类映射文件的autogen)


谢谢

如果要在过程中使用
build\u sql
值执行此操作,请省去前导冒号。这是一个参数化的值,这里不适用

还要在顶部声明
build\u sql
变量的长度。这有点令人困惑,因为您可以为参数保留长度,但需要为声明的变量保留长度

下面是一个程序的切碎版本,显示了
build\u sql
操作。还要注意,
CLASS\u定义
参数变量也不应该有冒号前缀:

CREATE OR REPLACE PROCEDURE WWNA.UT_MAPPINGHELPER
(
    TABLE_NAME IN ALL_TABLES.TABLE_NAME%TYPE
    , OWNER_NAME IN ALL_TABLES.OWNER%TYPE
    , CLASS_DEFINITION IN OUT VARCHAR2
)
IS
   ...
   build_sql varchar2(4000);
BEGIN
   build_sql := '';
   ...
   LOOP
      build_sql := build_sql || 'whatever';
   END LOOP;
   CLASS_DEFINITION := build_sql;  
END;
还请注意,您不需要
build\u sql:=''
行-变量值默认为空。或者,您可以在声明时指定初始值:

CREATE OR REPLACE PROCEDURE WWNA.UT_MAPPINGHELPER
(
    TABLE_NAME IN ALL_TABLES.TABLE_NAME%TYPE
    , OWNER_NAME IN ALL_TABLES.OWNER%TYPE
    , CLASS_DEFINITION IN OUT VARCHAR2
)
IS
   ...
   build_sql varchar2(4000) := 'start of my sql';
BEGIN
   ...
您需要定义变量
CLASS\u定义

使用将为您打开和关闭光标,以及批量获取结果


您也可以使用函数而不是函数。

变量前的所有冒号是什么?我不认为你需要那个。无论如何,您已经在使用concat操作符,| |,因此对于变量x,将是“x:=x | |”
build_sql:='
build_sql:=NULL
是等效的。在Oracle中,零长度字符串与NULL相同。因此
build_sql:='';如果build_sql为NULL,那么DBMS_OUTPUT.PUT_行('yes,它为NULL')
将打印
是的,它是空的
。非常好。连接的工作方式有两种(变量未初始化或变量已初始化为
),因此我决定不提出整个“空字符串为空”的问题,但你让我认为我应该这样做-对于从SQL Server(或MySQL)移动到Oracle的用户来说,这是一个真正的难题。
CREATE OR REPLACE PROCEDURE WWNA.UT_MAPPINGHELPER
(
    TABLE_NAME IN ALL_TABLES.TABLE_NAME%TYPE
    , OWNER_NAME IN ALL_TABLES.OWNER%TYPE
    , CLASS_DEFINITION IN OUT VARCHAR2
)
IS
   ...
   build_sql varchar2(4000) := 'start of my sql';
BEGIN
   ...
CREATE OR REPLACE PROCEDURE WWNA.UT_MAPPINGHELPER
(
    TABLE_NAME IN ALL_TABLES.TABLE_NAME%TYPE
    , OWNER_NAME IN ALL_TABLES.OWNER%TYPE
    , CLASS_DEFINITION IN OUT VARCHAR2
)
   IS
   CURSOR TABLE_INFO_CUR
   IS
    SELECT 
        T.TABLE_NAME
        , C.COLUMN_NAME
        ,C.DATA_TYPE
        ,C.DATA_LENGTH
        ,C.DATA_PRECISION
        ,C.NULLABLE
    FROM 
        ALL_TABLES T
        JOIN
        ALL_TAB_COLUMNS C
            ON T.TABLE_NAME = C.TABLE_NAME
                AND T.OWNER = C.OWNER
    WHERE
        T.TABLE_NAME = :TABLE_NAME
        AND T.OWNER = :OWNER_NAME;

    build_sql varchar2(32767);
BEGIN
    --build_sql := ''; --Not needed, build_sql is already initialised to NULL


    FOR cur_rec IN TABLE_INFO_CUR
    LOOP
        build_sql := build_sql || ' ' || 
                     cur_rec.TABLE_NAME || ' ' || 
                     cur_rec.COLUMN_NAME || ' ' || 
                     cur_rec.DATA_TYPE;
    END LOOP;
    CLASS_DEFINITION := build_sql;  

    --DBMS_OUTPUT.put_line (CLASS_DEFINITION);


END;