我使用的是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;*/
我遇到了各种错误,但我怀疑我实际上必须枚举所有目标列及其各自的值。我真的不想这样做,但在修复三个值后使用输入变量。 甚至可以这样做吗? 谢谢无论如何 杰夫
答案 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的答案中)。一般来说,如果可以的话,最好绑定。