oracle - 如何将表作为参数传递并使用 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);
解决方案
我建议您可以使用以下查询在您的过程中创建一个动态查询:
下面的查询将为您提供输入参数 (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';
检查此解决方案是否适合您。如果您对此有任何疑问,请告诉我。我会尝试解决它。
谢谢。
推荐阅读
- python - 密码学构建轮子失败。无法为使用 PEP 517 且无法直接安装的密码学构建轮子
- c++ - VS2019:致命错误 C1083 无法打开头文件:'opencv.hpp'
- javascript - 没有得到数组的值,但数组存在 - JS
- mysql - 如何在 Airflow MySQLHook 中支持 SSL(特别是 AWS 2019CA)
- npm - PNPM 安装确实有效,但 ProdBuild 失败
- java - MYSQL Left join 失败,java 中出现“未知列”
- zapier - 同时添加新人和新交易
- apache-kafka - 来自不同消费者组的多个消费者如何从同一个分区中读取数据?
- c# - 为一群人提供可见性 Web 选项卡,从数据库获取数据到布局页面 | ASP.NET 核心 3.1
- c# - System.Net.WebClient() DownloadUsingWebClientAsync 在 .netcore 3.1 中工作,但不适用于 .netcore 2.2(代理后面)