使用execute immediate将oracle用户rowtype变量插入表中

时间:2015-02-11 22:00:06

标签: oracle plsql rowtype

我使用的是Oracle 11g。 我有一个函数,我想用它插入到表中的行。 其中一个参数是表%rowtype。这已经填充了大多数正确的数据。 其中一个参数是表示目标表名的varchar2。 我想更改表%rowtype类型的变量中的三列中的值,然后将其插入由varchar2类型的输入变量命名的表中。

  FUNCTION AddMP(vMP          IN MEASUREPOINT%ROWTYPE,
                  vNewPointNum IN MEASUREPOINT.POINTNUM%TYPE,
                 v_CalMtrName IN MEASUREPOINT.METERNAME%TYPE) RETURN VARCHAR2 IS
      v_RetVal       VARCHAR2(50) := K_OKAY;
      v_Status       VARCHAR2(50) := NULL;
      v_AssetNum     MEASUREPOINT.ASSETNUM%TYPE;
      v_SiteId       MEASUREPOINT.SITEID%TYPE;
      v_OrgId        ASSETMETER.ORGID%TYPE;
      v_ChangeDate   ASSETMETER.CHANGEDATE%TYPE;
      v_err_num      NUMBER;
      v_err_msg      VARCHAR2(255);
      v_err_string   VARCHAR2(1000) := NULL;
      v_insert_str   VARCHAR2(2000) := NULL;
      v_RowsAffected VARCHAR2(10) := NULL;
      v_NewMP        MEASUREPOINT%ROWTYPE;
   BEGIN
      v_AssetNum   := vMP.Assetnum;
      v_SiteId     := vMP.Siteid;
      v_ChangeDate := SYSDATE;
      v_OrgId      := vMP.Orgid;
      --Put new data into vMP

      tempMP                := vMP;
      tempMP.Pointnum       := vNewPointNum;
      tempMP.Metername      := v_CalMtrName;
      tempMP.Measurepointid := measurepointseq.nextval;
      tempMP.Pointnum       := vNewPointNum;

      /*      v_insert_str := ' insert \*+ ignore_row_on_dupkey_index(tab, tab_pk) *\into ' ||
                            TABLE_MEASUREPOINT || ' values :insertRecord ';
      */
          v_insert_str := ' insert /*+ ignore_row_on_dupkey_index(tab, tab_pk)     */into ' ||
                          TABLE_MEASUREPOINT || ' values tempMP ';

          EXECUTE IMMEDIATE v_insert_str;
          /*INSERT INTO MEASUREPOINT_TEMP VALUES tempMP;*/

我遇到了各种错误,但我怀疑我实际上必须枚举所有目标列及其各自的值。我真的不想这样做,但在修复三个值后使用输入变量。 甚至可以这样做吗? 谢谢无论如何 杰夫

2 个答案:

答案 0 :(得分:0)

如果您知道表MEASUREPOINT的列名,则可以执行此操作。假设列是(col1,col2),那么您的插入将是:

v_insert_str := ' insert /*+ ignore_row_on_dupkey_index(tab, tab_pk)     */into ' ||
            TABLE_MEASUREPOINT || ' values ('||tempMP.col1||','||tempMP.col2||')';

答案 1 :(得分:0)

要将rowtype变量传递给动态SQL,您应该使用绑定变量using

v_insert_str := ' insert /*+ ignore_row_on_dupkey_index(tab, tab_pk)     */into ' ||
                          TABLE_MEASUREPOINT || ' values :1 ';

EXECUTE IMMEDIATE v_insert_str using tempMP;

原始方法不起作用的原因是,通过execute immediate运行的动态SQL在其自己的范围内运行,超出了过程或块的范围。为了在execute immediate中使用局部变量,你必须使用绑定变量传递它们(如在我的答案中)或连接它们(如在@Aramillo的答案中)。一般来说,如果可以的话,最好绑定。