首页 > 解决方案 > 如何将表作为参数传递并使用 plsql 过程填充该表

问题描述

我想使用 plsql 填充一个表。它将获取表名作为参数并插入表中已经存在的记录。问题是当表中有主键时,不能有重复记录。我不知道如何解决这个问题。此代码生成 20 行并插入到特定表中。由于employee_id 是主键,我为此生成了序列。但我的问题是当我想为任何表插入记录时。简而言之,我想执行动态插入语句。

此代码可以很好地为员工表插入记录。

create or replace procedure proc ( number_of_records IN number )
IS
BEGIN
INSERT INTO employees (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID)
SELECT generate.nextval,FIRST_NAME,LAST_NAME,DBMS_RANDOM.STRING('A', 20),PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID
FROM employees where rownum<=number_of_records;
end proc;

execute proc(20);

标签: oraclestored-proceduresplsql

解决方案


我建议您可以使用以下查询在您的过程中创建一个动态查询:

下面的查询将为您提供输入参数 (V_TABLE_NAME) 的表名和列

    select  aa.table_name, 
            aa.column_name  
    from    all_tab_columns aa
    where   (instr(aa.table_name, '$') = 0 
    and     aa.owner = 'V_SCHEMA_NAME')
    and     aa.table_name = 'V_TABLE_NAME'; 

使用以下查询,您可以识别该输入表名称上可用的主键

    select  aa.table_name, 
            aa.column_name ,
            ac.constraint_type
    from   all_tab_columns aa,
           ALL_CONSTRAINTS ac
    where  aa.table_name = ac.table_name
    and    (instr(aa.table_name, '$') = 0 
    and    aa.owner = 'V_SCHEMA_NAME')
    and    aa.table_name = 'V_TABLE_NAME'
    and    ac.constraint_type = 'P'; 

检查此解决方案是否适合您。如果您对此有任何疑问,请告诉我。我会尝试解决它。

谢谢。


推荐阅读