{"id":946,"date":"2014-01-05T14:18:21","date_gmt":"2014-01-05T13:18:21","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=946"},"modified":"2014-01-05T15:31:06","modified_gmt":"2014-01-05T14:31:06","slug":"analisis-plsql-con-sonarqube-blockers","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-blockers\/","title":{"rendered":"An\u00e1lisis PL\/SQL con SonarQube &#8211; Blockers"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1504\" alt=\"PLSQL_BlockersCritical\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/PLSQL_BlockersCritical.jpg\" width=\"400\" height=\"266\" \/><\/a>En el post anterior, hemos creado <a href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-el-quality-profile-plsql\/\" target=\"_blank\">nuestro propio Quality Profile PL\/SQL,<\/a> activando todas las 132 reglas presentes en SonarQube. Luego, hemos ejecutado de nuevo nuestro an\u00e1lisis de c\u00f3digo PL\/SQL.<\/p>\n<p>Pues vamos a poder trabajar con todas las normas de calidad del Quality Profile predeterminado de SonarQube y seleccionar las que nos interesan para crear un cuadro de mando para nuestro entorno de demos. <!--more--><\/p>\n<h2>Las reglas de tipo Blocker<\/h2>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/Blockers.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1511\" alt=\"Blockers\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/Blockers.jpg\" width=\"669\" height=\"167\" \/><\/a><\/p>\n<p>Primero, encontramos 16 defectos con la regla \u2018Use IS NULL and IS NOT NULL instead of direct NULL comparisons\u2019. \u00bfDe que se trata?<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1513\" alt=\"RuleNULL\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL.jpg\" width=\"428\" height=\"47\" \/><\/a>Un drill-down desde esta lista de defectos y SonarQube nos permite acceder al c\u00f3digo erroneo.<\/p>\n<p>Podemos ver que el programador realiza una prueba con la variable &#8216;v_periodo&#8217; con el fin de comprobar si se trata de una cadena vac\u00eda, que probablement se ha inicializado de esta manera, o porque este valor &#8216;vacio&#8217; se asigna en alguna parte del algoritmo. Por ejemplo:<\/p>\n<pre>DECLARE\r\n   name v_periodo varchar(10) := ''<\/pre>\n<p>El problema es que:<\/p>\n<ol>\n<li>Oracle trata una cadena vacia como un valor NULL. Entonces, con el tratamiento anterior, nuestra variable <strong>no comporta <\/strong>una cadena vacia, pero el valor NULL.<\/li>\n<li>Oracle\u00a0hace la diferencia entre una cadena vac\u00eda y un valor NULL. Entonces, el test:<\/li>\n<\/ol>\n<pre>IF v_periodo = ''<\/pre>\n<p>devuelve <strong>false<\/strong> ya que v_periodo <strong>no comporta pas<\/strong> una cadena vacia, pero un valor NULL. El tratamiento correcto es:<\/p>\n<pre>IF v_periodo IS NULL<\/pre>\n<div class=\"almost_half_cell\" id=\"gt-res-content\">\n<div dir=\"ltr\">\n<p><span lang=\"es\"><span lang=\"es\"><span class=\"hps\">Aqu\u00ed tenemos un<\/span> <span class=\"hps\">buen ejemplo de un &#8216;bad practice&#8217; de<\/span> <span class=\"hps\">programaci\u00f3n\u00a0<\/span><span class=\"hps\">que<\/span> <span class=\"hps\">llevar\u00e1 sin duda<\/span> <span class=\"hps\">un error<\/span> <span class=\"hps\">de l\u00f3gica<\/span> <span class=\"hps\">en la aplicaci\u00f3n<\/span><span>, ya que la<\/span> <span class=\"hps\">condici\u00f3n probada<\/span> <span class=\"hps\">(cadena vac\u00eda<\/span><span>)<\/span> <span class=\"hps\">nunca ser\u00e1<\/span> <span class=\"hps\">posible,<\/span> <span class=\"hps\">y por lo tanto<\/span> <span class=\"hps\">nunca<\/span> <span class=\"hps\">se har\u00e1<\/span> <span class=\"hps\">el tratamiento correspondiente<\/span><span>.<\/span><\/span><\/span><\/p>\n<p><span class=\"hps\">Y, por supuesto<\/span><span>, como si<\/span> <span class=\"hps\">eso fuera poco<\/span><span>, nos encontramos con<\/span> <span class=\"hps\">este error<\/span> <span class=\"hps\">duplicado<\/span> <span class=\"hps\">unas pocas l\u00edneas<\/span> <span class=\"hps\">m\u00e1s abajo<\/span><span>:<\/span><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL21.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1519\" alt=\"RuleNULL2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL21.jpg\" width=\"404\" height=\"33\" \/><\/a>Creo que debe existir en alguna parte un teorema informatico o alguna variante de la ley de Murphy, que establece que el n\u00famero de Copiado-Pegado de una instrucci\u00f3n incorrecta es proporcional a la gravedad de este error.<\/p>\n<p>Los otros dos defectos de tipo &#8216;Blockers&#8217; son claros y basta con echar un ojo a la documentaci\u00f3n en SonarQube para entender porque es incorrecto y con cual consecuencia:<\/p>\n<\/div>\n<\/div>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleTrigger1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1521\" alt=\"RuleTrigger1\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleTrigger1.jpg\" width=\"582\" height=\"81\" \/><\/a><\/p>\n<p>Un COMMIT o un ROLLBACK en un trigger lleva un error ORA-04902. Se necesita utilizar una PRAGMA (instrucci\u00f3n de compilaci\u00f3n) para declarar una transacci\u00f3n para tal manipulaci\u00f3n. Bueno, yo cuestionar\u00eda cualquier instrucci\u00f3n de tipo DML (Data Manipulation Language) dentro de un trigger.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleBlocker3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1522\" alt=\"RuleBlocker3\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleBlocker3.jpg\" width=\"535\" height=\"108\" \/><\/a><\/p>\n<p>Se ha declarado una variable dos veces, lo que significar\u00e1 un un error Oracle PLS-03371. Me gusta especialmente que SonarQube indica las 2 l\u00edneas en las que esta instrucci\u00f3n se duplica, debido a que es uno de los defectos m\u00e1s dif\u00edciles de investigar, sobre todo en un programa como este que tiene decenas de miles de l\u00ednea. Esto es com\u00fan en las aplicaciones m\u00e1s antiguas PL\/SQL de tipo &#8216;Legacy&#8217;.<\/p>\n<p>\u00bfQu\u00e9 podemos decir acerca de estas 3 reglas &#8216;Blockers&#8217;? En primer lugar, se justifica complementament su nivel de gravedad:<\/p>\n<ul>\n<li>En el primer caso, esta &#8216;malpractice&#8217; de programaci\u00f3n lleva a un error l\u00f3gico y un bug muy muy posible.<\/li>\n<li>Y los dos casos siguientes son bugs que interrupen la aplicaci\u00f3n.<\/li>\n<\/ul>\n<p><span id=\"result_box\" lang=\"es\"><span class=\"hps\">Por lo tanto, son<\/span> <span class=\"hps\">tres reglas<\/span> <span class=\"hps\">para cuales <\/span>no <span class=\"hps\">se permitir\u00e1<\/span> <span class=\"hps\">ninguna violaci\u00f3n<\/span><span>: tolerancia<\/span> <span class=\"hps\">cero,<\/span> <span class=\"hps\">estos defectos<\/span> <span class=\"hps\">deben ser corregidos<\/span> <span class=\"hps\">inmediatamente.<\/span> <\/span><\/p>\n<p><span id=\"result_box\" lang=\"es\"><span class=\"hps\">Segunda<\/span> <span class=\"hps\">observaci\u00f3n:<\/span> <span class=\"hps\">estas<\/span> <span class=\"hps\">reglas son conocidas<\/span><span>, si consideramos<\/span> <span class=\"hps\">el escaso n\u00famero de<\/span> <span class=\"hps\">casos encontrados<\/span><span>.<\/span> <span class=\"hps\">Sin embargo<\/span><span>,<\/span> <span class=\"hps\">no se puede evitar<\/span><span>:<\/span><\/span><\/p>\n<ul>\n<li>Una nueva persona en el equipo, posiblemente principiante, pero en cualquier caso que no conoce la &#8216;best practice&#8217;. Apuesto a que este es el caso de la primera regla (uso de NULL \/ NOT NULL exclusivamente), y con un mismo programador que ha utilizado una sintaxis incorrecta y luego hizo Copy\/Paste en todas partes.<\/li>\n<li>Incluso cuando todo el mundo conoce la regla, es siempre posible la falta de atenci\u00f3n o el olvido moment\u00e1neo.<\/li>\n<\/ul>\n<p><span id=\"result_box\" lang=\"es\"><span title=\"Il est facile d'oublier de d\u00e9clarer une transaction ou qu'une variable a d\u00e9j\u00e0 \u00e9t\u00e9 d\u00e9clar\u00e9e quelques dizaines (voire centaines) de lignes plus haut.\">Es f\u00e1cil olvidarse de declarar una transacci\u00f3n o que una variable ya se ha declarado unas pocas decenas (o cientos) de l\u00edneas m\u00e1s arriba. <\/span><span title=\"Heureusement, le plugin PL\/SQL de SonarQube nous permet de v\u00e9rifier et corriger ces fautes d'attention simplement et rapidement.\">Afortunadamente, el plugin PL\/SQL SonarQube nos permite identificar y corregir estos errores de atenci\u00f3n de manera r\u00e1pida y f\u00e1cilmente. <\/span><span title=\"J'appr\u00e9cie tout particuli\u00e8rement de pouvoir descendre jusqu'\u00e0 la ligne de code o\u00f9 se trouve la violation, valider celle-ci et d\u00e9cider d'une rem\u00e9diation imm\u00e9diate.\">Aprecio especialmente poder bajar hasta la l\u00ednea de c\u00f3digo, validar el defecto y decidir por su remediaci\u00f3n inmediata.<\/span><\/span><\/p>\n<p>En el pr\u00f3ximo post, vamos a hablar de los defectos de tipo &#8216;Critical&#8217;. De nuevo, feliz a\u00f1o 2014, y nos vemos pronto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el post anterior, hemos creado nuestro propio Quality Profile PL\/SQL, activando todas las 132 reglas presentes en SonarQube. Luego, hemos ejecutado de nuevo nuestro an\u00e1lisis de c\u00f3digo PL\/SQL. Pues vamos a poder trabajar con todas las normas de calidad del Quality Profile predeterminado de SonarQube y seleccionar las que nos interesan para crear un [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"class_list":["post-946","post","type-post","status-publish","format-standard","hentry","category-sonarqube-plsql"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/946"}],"collection":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/comments?post=946"}],"version-history":[{"count":19,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/946\/revisions"}],"predecessor-version":[{"id":948,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/946\/revisions\/948"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=946"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}