txt: ## dist_zef-tony-o-Slang-SQL.md
  # Slang::SQL
  
  Quick little SQL SLang for perl6 to embed SQL into the language. Design goals were:
  
  * accept parameters
  * not have to quote your sql
  * treat SQL statements that return something as loops
  * have optional parameters/callback
  * nested SQLs
  * loop control `last`, `next` ..
  
  What it doesn't do [yet]
  
  * interpolate variables in the SQL
  * verify your SQL syntax is correct
  * handle your DB connection (currently depends on DBIish)
  * auto parameters based on SQL (PerlJam's suggestion, it's a cool idea)
  
  # Use
  
  ```
  use Slang::SQL;
  use DBIish;
  
  my $*DB = DBIish.connect('SQLite', :database<sqlite.sqlite3>);
  
  sql drop table if exists stuff; #runs 'drop table if exists stuff';
  
  sql create table if not exists stuff (
        id  integer,
        sid varchar(32)
      );
  
  for ^5 {
    sql insert into stuff (id, sid) 
      values (?, ?); with ($_, ('A'..'Z').pick(16).join);
  }
  
  sql select * from stuff order by id asc; do -> $row {
    FIRST "{$*STATEMENT}id\tsid".say;
    "{$row<id>}\t{$row<sid>}".say;
  };
  
  ```
  
  Output:
  
  ```
  select * from stuff order by id asc
  id      sid
  0       WSNPLYBHJRMVXKFQ
  1       UYNZMXFSABRCOLKP
  2       MIQVEDTNXBWGHZFL
  3       KFNJWXLSRQEUGBZA
  4       VDOMIUYCWQZHGRPF
  
  ```
  
  ## Equivalent Code Slang vs. Only DBIish
  
  ### Example Above
  
  #### Slang::SQL
  
  ```
  use Slang::SQL;
  use DBIish;
  
  my $*DB = DBIish.connect('SQLite', :database<sqlite.sqlite3>);
  
  sql drop table if exists stuff; #runs 'drop table if exists stuff';
  
  sql create table if not exists stuff (
        id  integer,
        sid varchar(32)
      );
  
  for ^5 {
    sql insert into stuff (id, sid) 
      values (?, ?); with ($_, ('A'..'Z').pick(16).join);
  }
  
  sql select * from stuff order by id asc; do -> $row {
    FIRST "{$*STATEMENT}id\tsid".say;
    "{$row<id>}\t{$row<sid>}".say;
  };
  
  ```
  
  #### DBIish
  
  ```
  use DBIish;
  
  my $db = DBIish.connect('SQLite', :database<sqlite.sqlite3>);
  
  $db.do('drop table if exists stuff;');
  
  $db.do('create table if not exists stuff (
            id  integer,
            sid varchar(32)
          )');
  
  for ^5 {
    $db.do('insert into stuff (id, sid) 
              values(?,?);', ($_, ('A'..'Z').pick(16).join));
  }
  
  my $sql  = 'select * from stuff order by id asc';
  my $stmt = $db.prepare($sql);
  
  $stmt.execute();
  while (my $row = $stmt.row(:hash)) {
    FIRST "{$sql}id\tsid".say;
    "{$row<id>}\t{$row<sid>}".say;
  }
  $stmt.finish;
  
  ```
  
  ### Nested SQL
  
  #### Slang::SQL
  
  ```
  use Slang::SQL;
  use DBIish;
  
  my $*DB = DBIish.connect('SQLite', :database<sqlite.sqlite3>);
  
  sql select * from stuff order by id asc; do -> $row1 {
    sql select * from stuff where id > ?; with ($row1<id>) do -> $row2 {
      #do something with $row1 or $row2!
    };
  };
  
  ```
  
  #### DBIish
  
  ```
  use DBIish;
  
  my $db = DBIish.connect('SQLite', :database<sqlite.sqlite3>);
  
  my $sql1 = 'select * from stuff order by id asc';
  my $sql2 = 'select * from stuff where id > ?';
  my $stm1 = $db.prepare($sql1);
  my $stm2 = $db.prepare($sql2);
  
  $stm1.execute();
  while (my $row1 = $stm1.row(:hash)) {
    $stm2.execute($row1<id>);
    while (my $row2 = $stm2.row(:hash)) {
      #do something here
    }
  }
  
  
  ```
  
  ## Mo Better Examples
  
  Check out `t/01_basic.t`
  