search
HomeDatabaseMysql Tutorialoracle外键反查套件

oracle外键反查套件

Jun 07, 2016 pm 02:57 PM
oracleforeign keyQuoteInquirequestion

用于查询我引用谁,谁引用我的问题 Examples: 查询我引用谁 SELECT*FROMTABLE(FK_UTIL.get_refering_stats(TABLE_A)); 查询谁引用我 SELECT*FROMTABLE(FK_UTIL.get_refered_stats(TABLE_A)); 查询ID为的某条记录的被引用计数 SELECT*FROMTABLE(FK_UTIL.get_re

用于查询我引用谁,谁引用我的问题

Examples:
 
查询我引用谁
SELECT * FROM TABLE(FK_UTIL.get_refering_stats('TABLE_A'));
 
查询谁引用我
SELECT * FROM TABLE(FK_UTIL.get_refered_stats('TABLE_A'));
 
查询ID为的某条记录的被引用计数
SELECT * FROM TABLE(FK_UTIL.get_refered_count('TABLE_A', ID));
 
查询某种条件下的被引用计数
-- 查询code为1的某条记录的被引用计数
SELECT * FROM TABLE(FK_UTIL.get_refered_count_cond('xb_std_types', 'code', '1'));
 
查询某表在某种条件下的被引用情况,并且附带出更详细的信息
SELECT TABLE_A.id, TABLE_A.COLUMN1, TABLE_A.COLUMN2, ..., stats.child_table, stats.refer_count
FROM TABLE_A
JOIN TABLE(FK_UTIL.get_refered_count_cond('TABLE_A', 'COLUMN', 'VALUE')) stats
ON stats.parent_id=TABLE_A.id;
 
-- 以下是安装脚本
CREATE OR REPLACE TYPE fk_stats_row AS object (
  child_table          varchar2(32),
  child_table_fk_col   varchar2(32),
  parent_table             varchar2(32),
  parent_table_pk_col   varchar2(32)
);
/
 
CREATE OR REPLACE TYPE fk_stats AS TABLE OF fk_stats_row;
/
 
CREATE OR REPLACE TYPE fk_refered_count_row AS object (
  child_table          varchar2(32),
  parent_id                NUMBER(19),
  refer_count          NUMBER(19)
);
/
 
CREATE OR REPLACE TYPE fk_refered_count AS TABLE OF fk_refered_count_row;
/
 
CREATE OR REPLACE TYPE id_array AS TABLE OF NUMBER(19);
/
 
CREATE OR REPLACE package FK_UTIL
IS
  -- 获得我所引用的表
  FUNCTION get_refering_stats(v_table_name varchar2) RETURN fk_stats;
  -- 获得所有子表及外键列
  FUNCTION get_refered_stats(v_table_name varchar2) RETURN fk_stats;
  -- 获得所有子表对某个ID的引用条数
  FUNCTION get_refered_count(v_parent_table varchar2, v_parent_id NUMBER) RETURN fk_refered_count;
  -- 获得所有子表对符合条件的某些记录的引用条数
  FUNCTION get_refered_count_cond(v_parent_table varchar2, v_cond_col varchar2, v_cond varchar2) RETURN fk_refered_count;
END FK_UTIL;
/
 
CREATE OR REPLACE package body FK_UTIL
IS
  -- 获得我所引用的表
  FUNCTION get_refering_stats(v_table_name varchar2) RETURN fk_stats
  IS
      v_ret fk_stats := fk_stats();
  BEGIN
      SELECT CAST(
          multiset(
              SELECT a.TABLE_NAME 从表, a.column_name 外键列,  b.TABLE_NAME 主表, b.column_name 被引用列
              FROM (
                  SELECT   uc.TABLE_NAME, ucc.column_name, uc.r_constraint_name
                  FROM     user_constraints uc
                  JOIN     user_cons_columns ucc
                  ON   uc.constraint_name = ucc.constraint_name
                  WHERE uc.constraint_type='R'
                  ) a,
                  (
                  SELECT   uc.TABLE_NAME, ucc.column_name, uc.constraint_name
                  FROM     user_constraints uc
                  JOIN user_cons_columns ucc
                  ON   uc.constraint_name = ucc.constraint_name
                  ) b
              WHERE
                  a.r_constraint_name = b.constraint_name
                  AND a.TABLE_NAME = UPPER(v_table_name)
          ) AS fk_stats
      ) INTO v_ret FROM dual;
      RETURN v_ret;
  END get_refering_stats;
 
  -- 获得所有子表及外键列
  FUNCTION get_refered_stats(v_table_name varchar2) RETURN fk_stats
  IS
      v_ret fk_stats := fk_stats();
  BEGIN
      SELECT CAST(
          multiset(
              SELECT a.TABLE_NAME 从表, a.column_name 外键列,  b.TABLE_NAME 主表, b.column_name 被引用列
              FROM (
                  SELECT   uc.TABLE_NAME, ucc.column_name, uc.r_constraint_name
                  FROM     user_constraints uc
                  JOIN     user_cons_columns ucc
                  ON   uc.constraint_name = ucc.constraint_name
                  WHERE uc.constraint_type='R'
                  ) a,
                  (
                  SELECT   uc.TABLE_NAME, ucc.column_name, uc.constraint_name
                  FROM     user_constraints uc
                  JOIN user_cons_columns ucc
                  ON   uc.constraint_name = ucc.constraint_name
                  ) b
              WHERE
                  a.r_constraint_name = b.constraint_name
                  AND b.TABLE_NAME = UPPER(v_table_name)
          ) AS fk_stats
      ) INTO v_ret FROM dual;
      RETURN v_ret;
  END get_refered_stats;
 
  -- 获得所有子表对某个ID的引用条数
  FUNCTION get_refered_count(v_parent_table varchar2, v_parent_id NUMBER) RETURN fk_refered_count
  IS
      v_ret fk_refered_count := fk_refered_count();
      v_count NUMBER := 0;
      v_sql varchar2(2000) := '';
  BEGIN
      FOR v_row IN (SELECT * FROM TABLE(get_refered_stats(v_parent_table))) loop
          v_sql := 'select count(*) from '|| v_row.child_table ||' where ' || v_row.child_table_fk_col || ' = ' || v_parent_id;
          EXECUTE immediate v_sql INTO v_count;
          v_ret.extend(1);
          v_ret(v_ret.COUNT) := fk_refered_count_row(v_row.child_table, v_parent_id, v_count);
      END loop;
      RETURN v_ret;
  END get_refered_count;
  -- 获得所有子表对符合条件的某些记录的引用条数
  FUNCTION get_refered_count_cond(v_parent_table varchar2, v_cond_col varchar2, v_cond varchar2) RETURN fk_refered_count
  IS
      v_ret fk_refered_count := fk_refered_count();
      v_id_array id_array := id_array();
      v_sql varchar2(2000) := '';
  BEGIN
      IF UPPER(v_cond_col) LIKE '%ID' THEN
          v_sql := 'select cast(multiset(select id from ' || v_parent_table || ' where '|| v_cond_col ||'=' || v_cond || ') as id_array) from dual';
      ELSE
          v_sql := 'select cast(multiset(select id from ' || v_parent_table || ' where '|| v_cond_col ||'=''' || v_cond || ''') as id_array) from dual';
      END IF;
      EXECUTE immediate v_sql INTO v_id_array;
      FOR id_row IN (SELECT * FROM TABLE(v_id_array)) loop
          FOR count_row IN (SELECT * FROM TABLE(get_refered_count(v_parent_table, id_row.column_value))) loop
              v_ret.extend(1);
              v_ret(v_ret.COUNT) := fk_refered_count_row(count_row.child_table, count_row.parent_id, count_row.refer_count);
          END loop;
      END loop;
      RETURN v_ret;
  END get_refered_count_cond;
END FK_UTIL;
/
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Adding Users to MySQL: The Complete TutorialAdding Users to MySQL: The Complete TutorialMay 12, 2025 am 12:14 AM

Mastering the method of adding MySQL users is crucial for database administrators and developers because it ensures the security and access control of the database. 1) Create a new user using the CREATEUSER command, 2) Assign permissions through the GRANT command, 3) Use FLUSHPRIVILEGES to ensure permissions take effect, 4) Regularly audit and clean user accounts to maintain performance and security.

Mastering MySQL String Data Types: VARCHAR vs. TEXT vs. CHARMastering MySQL String Data Types: VARCHAR vs. TEXT vs. CHARMay 12, 2025 am 12:12 AM

ChooseCHARforfixed-lengthdata,VARCHARforvariable-lengthdata,andTEXTforlargetextfields.1)CHARisefficientforconsistent-lengthdatalikecodes.2)VARCHARsuitsvariable-lengthdatalikenames,balancingflexibilityandperformance.3)TEXTisidealforlargetextslikeartic

MySQL: String Data Types and Indexing: Best PracticesMySQL: String Data Types and Indexing: Best PracticesMay 12, 2025 am 12:11 AM

Best practices for handling string data types and indexes in MySQL include: 1) Selecting the appropriate string type, such as CHAR for fixed length, VARCHAR for variable length, and TEXT for large text; 2) Be cautious in indexing, avoid over-indexing, and create indexes for common queries; 3) Use prefix indexes and full-text indexes to optimize long string searches; 4) Regularly monitor and optimize indexes to keep indexes small and efficient. Through these methods, we can balance read and write performance and improve database efficiency.

MySQL: How to Add a User RemotelyMySQL: How to Add a User RemotelyMay 12, 2025 am 12:10 AM

ToaddauserremotelytoMySQL,followthesesteps:1)ConnecttoMySQLasroot,2)Createanewuserwithremoteaccess,3)Grantnecessaryprivileges,and4)Flushprivileges.BecautiousofsecurityrisksbylimitingprivilegesandaccesstospecificIPs,ensuringstrongpasswords,andmonitori

The Ultimate Guide to MySQL String Data Types: Efficient Data StorageThe Ultimate Guide to MySQL String Data Types: Efficient Data StorageMay 12, 2025 am 12:05 AM

TostorestringsefficientlyinMySQL,choosetherightdatatypebasedonyourneeds:1)UseCHARforfixed-lengthstringslikecountrycodes.2)UseVARCHARforvariable-lengthstringslikenames.3)UseTEXTforlong-formtextcontent.4)UseBLOBforbinarydatalikeimages.Considerstorageov

MySQL BLOB vs. TEXT: Choosing the Right Data Type for Large ObjectsMySQL BLOB vs. TEXT: Choosing the Right Data Type for Large ObjectsMay 11, 2025 am 12:13 AM

When selecting MySQL's BLOB and TEXT data types, BLOB is suitable for storing binary data, and TEXT is suitable for storing text data. 1) BLOB is suitable for binary data such as pictures and audio, 2) TEXT is suitable for text data such as articles and comments. When choosing, data properties and performance optimization must be considered.

MySQL: Should I use root user for my product?MySQL: Should I use root user for my product?May 11, 2025 am 12:11 AM

No,youshouldnotusetherootuserinMySQLforyourproduct.Instead,createspecificuserswithlimitedprivilegestoenhancesecurityandperformance:1)Createanewuserwithastrongpassword,2)Grantonlynecessarypermissionstothisuser,3)Regularlyreviewandupdateuserpermissions

MySQL String Data Types Explained: Choosing the Right Type for Your DataMySQL String Data Types Explained: Choosing the Right Type for Your DataMay 11, 2025 am 12:10 AM

MySQLstringdatatypesshouldbechosenbasedondatacharacteristicsandusecases:1)UseCHARforfixed-lengthstringslikecountrycodes.2)UseVARCHARforvariable-lengthstringslikenames.3)UseBINARYorVARBINARYforbinarydatalikecryptographickeys.4)UseBLOBorTEXTforlargeuns

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software