web-dev-qa-db-fra.com

DB2 SYSCAT.ROUTINES VSS SYSIBM.ROUTINES

J'ai besoin de sélectionner toutes les noms de routines d'un DB2 LUW. J'ai vu les tables de catalogue suivantes:

  • sysibm.Routines
  • syscat.Routines

Si je cours les requêtes suivantes:

select count(*) from sysibm.routines;
select count(*) from syscat.routines;

Il y a une grande différence entre les résultats. Quelqu'un peut-il dire quelle est la différence entre ces vues et laquelle devrait être utilisée pour la sélection de tous les noms de routines?

2
zuckermanori

Sysibm.Routs et SysCat.Routines sont en réalité une vue sur la table de catalogue "réelle", Sysibm.sysRoutines. Vous pouvez attraper la définition SQL pour chaque vue comme si:

SELECT TEXT
FROM SYSCAT.VIEWS
WHERE VIEWSCHEMA = 'SYSIBM' AND VIEWNAME = 'ROUTINES';

SELECT TEXT
FROM SYSCAT.VIEWS
WHERE VIEWSCHEMA = 'SYSCAT' AND VIEWNAME = 'ROUTINES';

Je ne posterai pas les résultats ici car je ne sais pas si cela est considéré comme propriétaire par IBM (il est techniquement source de DB2 lui-même après tout). Quoi qu'il en soit, si vous regardez à travers la source d'affichage (vous voudrez d'abord le formater de nouveau avec certains SQL Lint - comme outil!) Vous remarquerez plusieurs choses:

  • Sysibm.Routines exclut les fonctions avec le type "T" et "R" (i.e. Fonctions de table et de ligne, de sorte qu'il n'inclut que des fonctions scalaires, des agrégats et des procédures). Cela explique probablement beaucoup la différence.
  • Sysibm.Routines exclut les routines dans le schéma Sysfun. Cela explique probablement le reste de la différence car il y a plus de 100 routines à Sysfun.
  • Syscat.Routines exclut uniquement les routines du schéma Sysibminternal (il n'y en a que quelques-uns - pas sûr de si tout/autre apparaît dans Sysibm.Routines étant donné les restrictions ci-dessus).
  • Il y a une charge de jointures dans chaque vue, mais je suis à peu près sûr qu'ils sont tous de 1 à 1 et ne concernent pas la cardinalité du résultat qui est dicté par Sysibm.SysRoutines (la plupart de ces jointures sont pour tirer des choses comme le type de résultat ou les détails de la collation).

Quelques fond:

  • Les tables commençant par SYS dans le schéma Sysibm sont les Real Tables de catalogue que tout est basé sur. Généralement, je ne me dérangerais pas avec ceux-ci comme ils sont sans papiers, et un peu de douleur à travailler (Cependant, dans des choses comme DB2 pour Z/OS qui manquaient de syscat lors de la dernière fois que je travaillais avec elle, ce sont les seules tables que vous 'j'ai).
  • Les vues non commençant par SYS dans le schéma Sysibm a une structure terriblement similaire à celle Informations standard_schema . Quelque chose les utilise probablement en tant que telle (peut-être certaines méthodes JDBC, ou les fonctions de catalogue dans divers conducteurs?) Mais comme ils sont autrement non documentés, il est difficile de savoir exactement ce qu'ils comprennent/excluent sans regarder leurs définitions d'affichage (en utilisant le tableau ci-dessus) .
  • Les vues du schéma Syscat sont les très utiles. Ils sont bien documenté et généralement assez facile à travailler (tristement, ils sont également DB2 pour LUW spécifiques).

En d'autres termes, je traiterais généralement les résultats de Syscat comme "gospel", mais si vous voulez comprendre exactement ce qu'ils montrent, vous devez plonger dans leur source.

2
Dave Jones