Caso de este artículo: Cree una tabla minfo completamente nueva con el nombre de usuario (nombre) encontrado en la tabla de usuario (sys_user) como el nuevo nombre de columna.
Después de comprender los requisitos, comience a escribir procedimientos almacenados.
Paso 1: abra la herramienta de visualización PL / SQL, busque "Procedimientos" en la parte inferior izquierda, haga clic con el botón derecho en la carpeta "Procedimientos", haga clic en "Nuevo ..."
Paso 2: escriba el nombre del procedimiento almacenado (Reglas de nombres de joroba) y los parámetros necesarios (opcional)
Después de escribir la información, haga clic en "Aceptar" y aparecerá un nuevo procedimiento almacenado, como se muestra a continuación
El tercer paso: escribir un procedimiento almacenado (el código detrás contiene comentarios para facilitar la comprensión)
create or replace procedure testFunction(officeId VARCHAR2) is
str1 varchar2(4000); --用于存放 获取原数据的SQL语句
str2 varchar2(200); --用于存放 原数据中的单个元素
ds sys_refcursor; --游标,指针用于循环【相当于for循环中的下标】
createsql varchar2(4000); --用于存放 创建新表的SQL语句
a number; --用于 计数某表是否存在于数据库中
dl varchar2(4000); --用于存放 删除的SQL语句
dorpsql varchar2(4000); --用于存放 查询表是否存在的SQL语句
begin
DBMS_OUTPUT.ENABLE(buffer_size => null);
str1:='SELECT DISTINCT name from sys_user where office_id ='''||officeId||'''';
dl:='drop table minfo';
createsql:='create table minfo(合计 varchar2(4000)';
open ds for str1; --将获取到的原数据进行循环,ds作为过渡元素使用
LOOP
FETCH ds INTO str2; --将ds中的结果依次插入到str2中
EXIT WHEN ds%NOTFOUND; --没有数据的时候,循环结束
createsql:=createsql||','||str2||' varchar2(4000)'; --拼接字符串【原数据中的元素】
END LOOP;
CLOSE ds;
createsql:=createsql||')';
dorpsql:='select count(*) from user_tables where TABLE_NAME =upper(''minfo'')'; --查询表是否存在
execute immediate dorpsql into a; --将查询是否存在的结果赋值给计数变量a
if a = 1 then --表 minfo 存在
execute immediate dl; --执行删除语句
end if;
dbms_output.put_line(createsql); --打印 创建表结构 的语句
execute immediate createsql; --执行创建新表的语句
end testFunction;
Paso 4: Después de escribir, ejecute el procedimiento almacenado: haga clic en el botón marcado en rojo
El quinto paso: llamar al procedimiento almacenado
(1) Llamar en la base de datos
--语法 call 方法名称(参数)
call testFunction('dea06cee037844cb8ccc1a5a2d29fb92')
(2) Llamar en el archivo XML
<select id="mysql" statementType="CALLABLE" parameterType="map" resultType="java.util.Map">
{call testFunction(#{officeId,jdbcType=VARCHAR,mode=IN})}
</select>
El sexto paso: ver el resultado final, el nombre de usuario como una columna para crear una nueva tabla minfo con éxito
PD: algunas explicaciones adicionales para los ejemplos
1. Compruebe si existe una tabla en la base de datos [cuenta (*) = 1, existe; igual a 0: no existe]
select count(*) from user_tables where TABLE_NAME =upper(表名)
2. La función upper (): convierte caracteres en minúsculas en caracteres en mayúsculas
3. DISTINCT: devuelve un valor único, equivalente a group by
4. Salida ilimitada: cuando el contenido que se va a enviar es demasiado grande, se informará un error y se puede evitar esta sintaxis. buffer_size: el número máximo de elementos de procesamiento del búfer. [Probablemente significa, sin investigación profunda]
DBMS_OUTPUT.ENABLE(buffer_size => null);
5. Imprima información, contenido de salida: equivalente a System.out.println () en código Java;
dbms_output.put_line(要输出的变量); --打印语句
El resultado de salida en el ejemplo es 'instrucción SQL para crear una estructura de tabla': después de ejecutar la instrucción SQL, haga clic en "Salida " para ver
6. Consulta los datos originales
7. Solo hay comillas simples en el proceso de almacenamiento : si se deben escapar varios lugares , es decir, dos "se escaparán en uno" . Hay dos lugares en el ejemplo, el mismo color está marcado como un par
(1) Declaración de consulta, "||": empalme ; marca roja: dos comillas simples se escaparán en una
(2) Las dos comillas simples del logotipo verde se escaparán en una durante la ejecución
Hasta ahora: este caso se ha realizado y finalizado. Las explicaciones / notas en el artículo se basan en la comprensión personal. Si hay algo mal, ¡gracias por corregir!